I
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
算法具有线性时间复杂度,不使用额外空间。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret=0;
for (int i = 0; i < nums.size(); i++)
ret ^= nums[i];
return ret;
}
};
II
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
结果输出的顺序不重要,对于上面的例子, [5, 3] 也是正确答案。
算法具有线性时间复杂度,仅使用常数空间复杂度。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int a = nums[0];
int b = 0;
int c = 0;
int n = 1;
vector<int> ret(2, 0);
for(int i = 1; i < nums.size(); i++)
a ^=nums[i];
while(true)
{
if((a & n )== n )
//找到为 1 的位置
break;
n *= 2;
}
for(int i = 0; i < nums.size(); i++)
{
if((nums[i] & n ) == n)
b ^= nums[i];
else
c ^=nums[i];
}
ret[0] = b;
ret[1] = c;
return ret;
}
};
III
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
算法具有线性时间复杂度,不使用额外空间。
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
附上一些大佬们的解题思路及代码链接:
https://www.jianshu.com/p/b3ab69759275
以上链接
https://www.cnblogs.com/daijinqiao/p/3352893.html
以上链接
https://www.cnblogs.com/chrischennx/p/4024466.html
以上链接
https://blog.csdn.net/i_am_bird/article/details/78160627
以上链接