[题目 1] 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?
[我解 1] A^B(A异或B)的结果R中为1的位表示,A和B该位的二进制表示是不同的,那么统计R的二进制表示中的1的位数即为需要改变的位数。
[我例 1] A = 10010010
B = 11001100
R = A ^ B = 01011110 ==> R的二进制表示中1的位数为5,故答案为5.
[题目 2] 数组循环移位问题:把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
[我解 2] 主要思想是利用求模运算进行循环。数组中下标为 i 的元素,在循环移位后的下标位置为 (i + K) % N.
void RightShift(int *arr, int N, int K)
{
int *tmp = new int[N];
memcpy(tmp, arr, N);
for (int i = 0; i < N; ++i)
{
arr[(i + K) % N] = tmp[i];
}
delete tmp;
}