华为面试题 - 0和1的变换
0->01
1->10
例如:
第一行:0
第二行:01
第三行:0110
第四行:01101001
第五行:0110100110010110
......
输入:N K (N表示第几行, K表示第几个数 (K和N从1开始) ) (范围:N[1-30], K[1,2^(N-1)])
输出:第N行第K个数是什么?
暴力迭代:
int arr[65535] = {0};
int arrT[65535] = {0};
int func(int n, int k){
int len = 1;
n--;
while(n){
int i = 0, j = 0;
do{
if(arr[i] == 0){
arrT[j++] = 0;
arrT[j++] = 1;
} else if(arr[i] == 1){
arrT[j++] = 1;
arrT[j++] = 0;
}
i++;
len--;
}while(len > 0);
len = j;
memcpy(arr, arrT, sizeof(arr));
n--;
}
return arrT[k-1];
}
存在一个问题,数组内容太大,K最大可以到达2^29, 内存占用太大。
递归:
int func(int n, int k){
if(n==1){
return 0;
}
if(k%2 == 0){
return func(n-1, k/2) > 0 ? 0 : 1;
}else{
return func(n-1, (k+1)/2);
}
}
思路很重要,思考问题有时候需要从后面往前面推。
华为,一直在路上。。。
JR-su 原创文章 6获赞 4访问量 271 关注 私信