开始cpp刷题之旅。
目标:执行用时击败90%以上使用 C++ 的用户。
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
解题:
这题看上去简单,但是考虑到效率性还是有很多讲究的。
有几种比较简单的方法
法一:
循环遍历数组,直接使用find()查找另一个,如果没有找到说明这个数就是题目需要的那个,直接返回,有就继续。 但是这样效率会差点,你之前找的数下一次可能还要继续查找一次,浪费效率。
法二:
先对数组进行排序。循环遍历排序后的数组,如果当前数和下一个数相等,则说明有重复的,i+1; 当前数如果和下一个不等,就直接返回。 这样可以避免重复查找的问题,但是会涉及到排序。
法三
使用异或。 一个数与本身异或等于0,0与其他数异或等于那个数,这句话很重要。
这样只要遍历一次即可,也不用考虑排序的问题,最适合这道题了。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res=0;
for(int &i:nums)
res^=i;
return res;
}
};
直接返回最后的结果,肯定就是那个单独出现的数,这个解法很巧妙。
看下提交记录: