C++ 之LeetCode刷题记录(二十七)

开始cpp刷题之旅。

目标:执行用时击败90%以上使用 C++ 的用户。

在这里插入图片描述

136. 只出现一次的数字

给你一个 非空 整数数组 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;
    }
};

直接返回最后的结果,肯定就是那个单独出现的数,这个解法很巧妙。

看下提交记录:

C++ 之LeetCode刷题记录(二十七)_第1张图片

你可能感兴趣的:(c++,数据结构,c++,leetcode,开发语言)