本文主要是介绍数组中只出现的1次,的一个数,两个数._位运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1、只有一个出现过一次,其他都出现两次,求这个出现一次的数
- 1、描述
- 2、思路
- 3、note
- 4、复杂度
- 5、code
1、只有一个出现过一次,其他都出现两次,求这个出现一次的数
异或,相同为0,不同为1,
a ^ 0 == a,
a ^ a == 0;
auto res = 0;
for(auto tem : nums){res ^=tem;}return res;
1、描述
面试56-1一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、思路
异或同为零,
之前有一个求一个数组中其他只出现两次,求出唯一一个出现1次的数字
3、note
1第一步赋值,等排序之后
2答案找到了就赶紧结束,既能节省时间又能防止后边else中的地址越界
3 ( (a^nums[i]) !=0) 中间有括号,
4 sort(nums.begin(),nums.end());是begin(),到.end()
4、复杂度
时间O(n)只需遍历一遍数组
空间O(1)
5、code
class Solution {
public:vector<int> singleNumbers(vector<int>& nums) {int n=nums.size(); vector<int>v;sort(nums.begin(),nums.end());int a=nums[0]; // 这个赋值s要在排序之后进行for(int i=1;i<n;i++) // 进行n-1次比较{if( (a^nums[i]) !=0) // 不同的就加入答案数组, (a^nums[i]) 有括号{v.push_back(a);if(v.size()==2) // 如果够了就退出 否则 1 2 3 3 错break;a=nums[i];}else{i=i+1;a=nums[i];if(a==nums[n-1]){v.push_back(a);} }}return v;}
};
这篇关于数组中只出现的1次,的一个数,两个数._位运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!