赞
踩
位运算的运算对象只能是整型或者字符型数据。
C++ 的位运算符:
C++中的移位运算:
移位运算是指将二进制信息串作为整体移动。
1、位异或运算
异或运算: 相同为0,不同为1。将数组中的所有元素求异或和,对于相同的元素,异或的结果为0。因此,数组中成对出现的元素异或和为0,所有元素的异或和即为只出现一次的元素。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = nums[0];
for(int i = 1; i < nums.size(); i++) {
ans ^= nums[i];
}
return ans;
}
};
2、位异或运算2
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
分析:
有了例题1的经验,我们可以想到:如果将整型数组nums分为两个组,分组满足
那么,只需要对这两个组分别做一次异或和运算,得到的结果就是两个只出现一次的数字。
关键来了,如何进行分组呢?
**取整型数组异或和为1的那一位,为1的分为一组,为0的分为一组,是否满足上面两个条件: **
代码实现如下:
class Solution { public: vector<int> singleNumbers(vector<int>& nums) { // 求异或和 int ans = nums[0]; for(int i = 1; i < nums.size(); i++) { ans ^= nums[i]; } // 找到异或和结果中为1的那一位 int div = 1; while((ans & div) == 0) div = div << 1; // 分组 int a = 0, b = 0; for(int i = 0; i < nums.size(); i++) { if((div & nums[i]) == 0) { a ^= nums[i]; } else { b ^= nums[i]; } } return vector<int>{a, b}; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。