1.190. 颠倒二进制位
题目描述:
颠倒给定的 32 位无符号整数的二进制位。
示例:
示例 1:
输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:
输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
解答描述:
最直观的方式,得到32位二进制数的每一位,然后把他逆转过来添加到结果中。
具体地,见官方题解
代码:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
//得到每一位的数,然后逆转
uint32_t reverse_n=0;
for(int i=0;i<32;i++)
{
reverse_n |=(n&1)<<(31-i);//n&1得到的还是n,将n左移31-i位,得到最低位的数
n=n>>1;//把最低位移除,得到新的最低位
}
return reverse_n;
}
};
2.136. 只出现一次的数字
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例:
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解答描述:
看官方题解吧,说的非常明白。主要利用的就是异或的三大性质
1)a^0=a;
2)a^a=0;
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
//数组中的所有元素进行异或,得到的就是只出现一次的元素
//a0^a0=0,0^a0=a0且异或有结合律
int n=nums.size();
int ans=nums[0];
for(int i=1;i<n;i++)
{
ans=ans^nums[i];
}
return ans;
}
};