Day1
题目一:
题目描述:
解题思路:
现在我们来看题目,题目要求的是两数转换需要变动多少位(二进制位),换句话说,题目问的是两数二进制之间有多少处不同。
我们先把两数异或,把值存在变量 c 中,然后再用到我们的按位与运算符,即 &,和按位异或不同,按位与是两整数二进制位逐位进行比较,遇0为0,否则为1,这里我们利用数字1,因为它的二进制中只有1个1,且在最右边,我们可以把它们进行比较。
因为1只有最右边为1,所以如果想32位都能比到的话,就需要我们的右移操作符了,每比较一次,我们的变量 c 就向右移动一位(左端补符号位),此时只需要在外面套上for循环,循环次数为32次,这样我们就能把 c 中的每一位与数字1进行 按位与 比较了。
只要我们在 c 的二进制位中找到一个1,计数器count就++,最后程序返回count的值就行了。
代码实现:
int convertInteger(int A, int B)
{
//位运算,先异或(相同为0,相异为1)
//再利用0的二进制进行与运算(遇1为1)
int c = A ^ B;//两数异或后的值
int i = 0;//循环控制器
int count = 0;//计数器
for(i = 0 ;i < 32 ;i++)
{
if(c & 1 == 1)//利用与1的 按位与 运算,发现一个1,计数器就++
{
count++;
}
c >>= 1;// c 变量的二进制位往右移动一位
}
return count;//返回计数器的值
}
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
解题思路:
因为是有序的,所以用二分查找更快。找到比k小的第一个数作为左边界,找到比k大的第一个数作为右边界,右-左即k的个数。
按普通找某个数的位置来找,只是把int 改为double, 找k-0.5和k+0.5
代码实现:
int position(int* data, int n, double k)
{
int left = 0, right = n - 1, mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (data[mid] < k)
left = mid + 1;
else if (data[mid] > k)
right = mid - 1;
else
return mid;
}
return left;
}
int GetNumberOfK(int* data, int dataLen, int k )
{
return position(data, dataLen, k + 0.5) - position(data, dataLen, k - 0.5);
}
}
结果情况:
符合题目要求,问题得到解决。