如何做网站建设方案,网站备案查询 美橙,wordpress文章添加字段,免费自己做网站软件题目1#xff1a;下一个数
给定一个正整数#xff0c;找出与其二进制表达式中1的个数相同且大小最接近的那两个数#xff08;一个略大#xff0c;一个略小#xff09;。
示例#xff1a; 输入#xff1a;num 2#xff08;或者0b10#xff09; 输出#xff1a;[4,…题目1下一个数
给定一个正整数找出与其二进制表达式中1的个数相同且大小最接近的那两个数一个略大一个略小。
示例 输入num 2或者0b10 输出[4, 1] 或者[0b100, 0b1] 输入num 1 输出[2, -1] 解题思路
1.先用bitset将num的32位二进制表示出来存放到数组中方便可以遍历
2.较大值从左往右找到第一个01将其转换成10再将右侧剩余的1全都移动到最低位
eg.0101110 -1000111
3.较小值从左往右找到第一个10将其转换成01 再将右侧剩余的1全都移动到最高位
eg.1001110 -0111100
4.bitset数组的下标是从低位开始的也就是从右往左进行遍历 源代码如下
class Solution {
public:vectorint findClosedNumbers(int num) {bitset32 smaller(num);//将二进制表示出来bitset32 bigger(num);//找较小值int a-1;//a初始化为-1for(int i1;i32;i){//找到10变成01if(smaller[i]1 smaller[i-1]0){smaller.flip(i);//flip(i)将第i位上的数字进行翻转 0转11转0smaller.flip(i-1);//将右侧剩余的1全移动到高位//相当于left和right的位互换for(int left0,righti-2;leftright;){//从低位找到第一个不为0的while(leftright smaller[left]0) left;//从高位找到第一个不为1的while(leftright smaller[right]1) right--;//位翻转smaller.flip(left);smaller.flip(right);}//smaller.to_ulong() 将数组smaller转成unsigned long类型的值//再强转成int类型a(int)smaller.to_ulong();break;}}//找较大值int b-1;//在找较大值时bigger要保证正数最高符号位保证为0最大正数为21474836472进制31个1i只能到第30位如果写 i32 会出现上溢所以这里与较小值不同的点在于要将i32改为i31,防止溢出for(int i1;i31;i){//找到01变成10if(bigger[i]0 bigger[i-1]1){bigger.flip(i);bigger.flip(i-1);//将右侧剩余的1全移动到低位for(int left0,righti-2;leftright;){while(leftright bigger[left]1) left;while(leftright bigger[right]0) right--;bigger.flip(left);bigger.flip(right);}b(int)bigger.to_ulong();break;}}return {b,a};}
}; 题目2整数转换
编写一个函数确定需要改变几个位才能将整数A转成整数B。 示例 输入A 29 或者0b11101, B 15或者0b01111 输出2 输入A 1B 2 输出2 解题思路
1.用bitset将整数A和B的32位 二进制表示出来存放在数组里进行遍历
2.遇到aa[i]!bb[i]说明需要转换count即可 源代码如下
class Solution {
public:int convertInteger(int A, int B) {bitset32 aa(A);//A的二进制bitset32 bb(B);//B的二进制int i0;//都是32位所以只需要一个下标进行遍历int count0;//用来记录需要改变的次数while(i32){//遇到当前位不相等的就需要转换countif(aa[i]!bb[i]){count;}i;}//返回countreturn count;}
}; 题目3配对交换
编写程序交换某个整数的奇数位和偶数位尽量使用较少的指令也就是说位0与位1交换位2与位3交换以此类推。 示例 输入num 2或者0b10 输出 1 (或者 0b01) 解题思路
1.用bitset将num的二进制保存到数组中便于用下标进行访问
2.从低到高两两进行交换i2
3.将最后的结果用to_ulong()函数先转成unsigned long类型再强转成int类型 源代码如下
class Solution {
public:int exchangeBits(int num) {bitset32 bit(num);int i0;//从低到高进行两两交换//注意因为要访问i1所以循环结束条件为i31,防止越界while(i31){int tempbit[i];bit[i]bit[i1];bit[i1]temp;i2;//i每次跳两个位数}//bit.to_ulong() 将二进制数转成unsigned long类型的值//再强转成int类型就可以返回了return (int)bit.to_ulong();}
};