力扣136.只出现一次的数字
题目:
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
思路:
既然是数组中的元素只出现一次,能想到的有三种情况:结果在第一位:12233.... 或 结果在中间位置:112234455... 或 结果在末尾112233...4,既然只有这几种情况出现,不妨先用简单的解法解答一下:
但这种解法的时间复杂度是sort占主导为O(n logN),while循环是O(n),所以最后的时间复杂度是O(N),虽然空间复杂度是O(1),但没有对应题目上的线性时间复杂度,所以还需要另一种解法,就是使用位运算,异或的性质。
class Solution {
public:int singleNumber(vector<int>& nums) {//只有一个元素就是结果,直接返回if(nums.size() == 1) return nums[0];//只有三种情况,12233 或 11233 或 11223sort(nums.begin(),nums.end());int i = 0;int n = nums.size();while(i < n-1){if(nums[i] == nums[i+1]){i+=2;}else{return nums[i];//第二种情况}}if(i == n-1) return nums[n-1];//第三种情况else return nums[0];//第一种情况}
};
另一个思路:
使用异或解答:
可以看到代码量很少,一个for循环就解决了,时间复杂度是O(N),我认为这个题目能一次做出这种解法的人是天才,因为此题目像是为了一包醋去特意包的饺子,根据异或性质(异或运算消除偶数1的性质)来出的题。
class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(auto it:nums){ret = ret ^ it;}return ret;}
};