【leetcode】136. 只出现一次的数字( Single Number )


题目描述

【leetcode】136. 只出现一次的数字( Single Number )
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

在这里插入图片描述

第一次解答

思路:
排序,然后检查相邻元素

注意:
nums.size() == 1

test case:
[2,2,1]
[4,1,2,1,2]
[1]

#include <algorithm>
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        if(nums.size() == 1){
            return nums[0];
        }
        // (operator <)左小右大
        sort(nums.begin(), nums.end());
        for(int i=0; i+1<nums.size(); i+=2){
            if(nums[i] != nums[i+1])
                return nums[i];
        }
        return nums[nums.size()-1];
    }
};

结果:
在这里插入图片描述

第二次解答

思路:
建立个哈希表(C++11 中的unordered_map),遍历nums,若表中无元素则添加,
否则删除表中元素,最后剩下的就是那个唯一值

#include <unordered_map>
class Solution {
public:
    int singleNumber(vector<int>& nums) {

        unordered_map<int, int> all_nums;
        for(int i=0; i<nums.size(); ++i){
            // 如果all_nums中没找到元素,则添加
            if(all_nums.end() == all_nums.find(nums[i])){
                all_nums[nums[i]] = nums[i];
            }
            else{
                all_nums.erase(nums[i]);
            }
        }
        auto result = all_nums.begin();
        return result->second;
    }
};

结果:
在这里插入图片描述

第三次解答

思路:
位操作,任意数与0异或为其本身,与本身异或为0
并且,异或运算可交换性

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

结果:
在这里插入图片描述

相关/参考链接

发布了88 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/a435262767/article/details/103965745
今日推荐