题目一:
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
数据范围: 0≤n≤1000 , 0≤k≤100 ,数组中每个元素的值满足 0≤val≤100
解题思路:
注意到,数组为非降序的整数,此时采用二分查找的方法最佳。先找到最左边的数字位置,在找到最右边的数字位置,两个位置相减+1就可以的到答案。
中间值比要找的值大:则要找的数在数组的左边,right=mid -1;
中间值比要找的值小:则要找的数在数组的右边,left=mid+1;
中间值等于要找的值:(开始找左边和右边的位置)
找到最左边的位置:如果mid就等于left,则返回mid就好,否则重置right=mid-1,把中心不断往左移。
找到最右边的位置:如果mid就是right,则返回mid就好,否则重置left=mid+1,把中心不断往右。
int get_last_or_first_idx(int* data, int dataLen, int k, int flag)
{
int left = 0;
int right = dataLen - 1;
while (left <= right)
{
int mid = left + (right-left) / 2;
if (data[mid] > k)
{
right = mid - 1;
}
else if (data[mid] < k)
{
left = mid + 1;
}
else
{
//找到最左边位置
if (flag == 0)
{
if (left == mid || data[mid - 1] != k)
return mid;
else
right = mid - 1;//把中心往左移
}
//找到最右边位置
if (flag == 1)
{
if (right == mid || data[mid + 1] != k)
{
return mid;
}
else
{
left = mid + 1;//把中心右移
}
}
}
}
}
int GetNumberOfK(int* data, int dataLen, int k)
{
//判断是否是数组
if (dataLen == 0)
return 0;
int left = get_last_or_first_idx(data, dataLen, k, 0);
int right = get_last_or_first_idx(data, dataLen, k, 1);
return right - left + 1;
}
题目二:
整数转换。编写一个函数,确定需要改变几个位才能将整数 A 转成整数 B 。
意思是,变换几个二进制数,两个数值相等
int get_bin_count(int x)
{
int i;
int count = 0;
for (i = 0; i < 32; i++)
{
//1的补码是00000000 00000000 00000000 00000001,
//和1按位与可以的到x中有几个1
if (x >> i & 1)
{
count++;
}
}
return count;
}
int convertInteger(int A, int B)
{
return get_bin_count(A ^ B);//A和B按位亦或,得到不同比特位的数
}
二分查找解决数组计数与整数位操作转换问题
4530





