糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > LeetCode Single Number I / II / III

LeetCode Single Number I / II / III

时间:2024-03-09 10:27:04

相关推荐

LeetCode Single Number I / II / III

【1】LeetCode 136 Single Number

题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数。

解法:容易想到异或的性质,两个相同的数异或为0,那么把这串数从头到尾异或起来,最后的数就是要求的那个数。

代码如下:

class Solution {public:int singleNumber(vector<int>& nums) {int sum = 0;for(int i=0;i<nums.size();i++) sum ^= nums[i];return sum;}};

【2】LeetCode 137Single Number II

题意:给一串数,除了一个数只出现一次外,其他数都出现了三次。求那个单个数。

解法:还是从位操作上考虑,把每个数写成二进制列出来,每位对齐,可以发现,每一位上的1的个数要么是3的倍数,要么是3的倍数+1,那么把每一位的1个数加起来,模3即可的单个数的该位为0还是为1。

代码如下:

class Solution {public:int singleNumber(vector<int>& nums) {int ans = 0;for(int i=0;i<32;i++) {int dream = (1<<i), cnt = 0;for(int j=0;j<nums.size();j++)cnt += (bool)(nums[j] & dream);cnt = cnt % 3;ans ^= (cnt << i);}return ans;}};

【3】LeetCode 260 Single Number III

题意:有一串数字,其中有两个不同的数,各出现一次,其他的数都出现2次。找出这两个数。

解法:看到其他数出现两次,又想到异或操作,如果全部异或起来,得到的是那两个数的异或。既然是两个不同的数,那么异或的二进制里面必然是有1的,我们先找出这个1,然后逐个检查,如果这位有1,那么异或到a,否则异或到b,最后的a,b即是这两个值。找1可以找最后一个1,x&(-x)即可。

代码如下:

class Solution {public:vector<int> singleNumber(vector<int>& nums) {int xorsum = 0;for(int i=0;i<nums.size();i++) xorsum ^= nums[i];int lastdifferentbit = xorsum & (-xorsum);int a = 0, b = 0;for(int i=0;i<nums.size();i++) {if(nums[i] & lastdifferentbit) a ^= nums[i];else b ^= nums[i];}return vector<int>{a,b};}};

如果觉得《LeetCode Single Number I / II / III》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。