服装网站设计模板,化妆品网站设计论文,网络推广电话,重庆市建设工程信息网查证件本专栏为c语言练习专栏#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新#xff0c;通过每天练习#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字#xff1a;整数转换 异或 #x1f493;博主csdn个人主页#xff1a;小小unicorn… 本专栏为c语言练习专栏适合刚刚学完c语言的初学者。本专栏每天会不定时更新通过每天练习进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字整数转换 异或 博主csdn个人主页小小unicorn ⏩专栏分类C语言天天练 代码仓库小小unicorn的代码仓库 关注我带你学习编程知识 Day1 题目一题目描述解题思路代码实现结果情况 题目二题目描述解题思路代码实现结果情况 总结 题目一
题目描述 整数转换。编写一个函数确定需要改变几个位才能将整数A转成整数B。 解题思路 题目来源整数转换 首先我们要明白异或运算符的原理^ 这个就是异或运算符两整数二进制位进行逐位比较相同为0相异为1比如我们的数字1二进制表示为 0001数字2二进制表示为 0010对1和2进行异或结果为 0011。这就是相同为0相异为1的规则。 现在我们来看题目题目要求的是两数转换需要变动多少位二进制位换句话说题目问的是两数二进制之间有多少处不同。
我们先把两数异或把值存在变量 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为1int 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;//返回计数器的值
}
结果情况 符合题目要求问题得到解决。
题目二
题目描述 题目来源数字在升序数组中出现的次数 给定一个长度为 n 的非降序数组和一个非负数整数 k 要求统计 k 在数组中出现的次数 数据范围0≤n≤1000,0≤k≤100数组中每个元素的值满足 要求空间复杂度 O(1)时间复杂度 O(logn) 解题思路
因为是有序的所以用二分查找更快。找到比k小的第一个数作为左边界找到比k大的第一个数作为右边界右-左即k的个数。
按普通找某个数的位置来找只是把int 改为double, 找k-0.5和k0.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;elsereturn mid;}return left;
}
int GetNumberOfK(int* data, int dataLen, int k )
{return position(data, dataLen, k 0.5) - position(data, dataLen, k - 0.5);
}
}结果情况 符合题目要求问题得到解决。
总结 文章到这里就要告一段落了有更好的想法或问题欢迎评论区留言。 希望今天的练习能对您有所收获咱们下期见