百度笔考试题啊求算法太伤心了
百度笔试题啊,求算法太伤心了
1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增
1 2 3
3 5 6
4 8 9
现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)
2.设 一个64位整型n,各个bit位是1的个数为a个. 比如7, 2进制就是 111, 所以a为3。
现在给出m个数, 求各个a的值。要求代码实现。
。。。不会啊
------解决方案--------------------
第一个不会;
第二个:
1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增
1 2 3
3 5 6
4 8 9
现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)
2.设 一个64位整型n,各个bit位是1的个数为a个. 比如7, 2进制就是 111, 所以a为3。
现在给出m个数, 求各个a的值。要求代码实现。
。。。不会啊
------解决方案--------------------
第一个不会;
第二个:
- C/C++ code
#include<stdio.h> #define M 5 int count=0; int GetCnt(int n) { count=0; do{ if( n&1) { count++; } } while( n>>=1 ); return count; } int main(int argc,char * argv[]) { int test[M]={7,3,34,2,234}; for(int i=0;i<M;++i) { printf("%d\n",GetCnt(test[i]) ); } return 0; }
------解决方案--------------------
第一个
- C/C++ code
int fun(int k, int (*)a[]) { if (k < a[n-1][n-1]) return 1; else return 0; }
------解决方案--------------------
- C/C++ code
bool function (int k , int a[][n],int m) { for (int i=0; i<m; i++) for (int j=0; j<n;j++) { if (k == a[i][j]) return true; else continue; } return false; }
------解决方案--------------------
第一个,我觉得用递归比较好。
首先找第一个哨兵:arry[N/2][N/2]与K判断。
1 2 3 4
3 5 6 7
4 8 9 10
5 11 12 13
K<arry[N/2][N/2]时,产生2个哨兵:arry[N/4][N/2]和arry[N/2][N/4],继续判断,又转化为同样的问题。
K>arry[N/2][N/2]时,同理。
想来想去,比树好实现些