136.只出现一次的数字

题目


给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4

解题思路


  • 不用额外空间,考虑位运算
  • 异或:
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto e: nums) ret ^= e;
        return ret;
    }
};
  • 记录一个很好的思路:
public static int SingleNumber(int[] nums)
{
    HashSet<int> set = new HashSet<int>();
    for (int i = 0; i < nums.Length; i++)
    {
        //该判断语句的整体作用是:如果当前数字(nums[i])已经在之前出现过,那么在哈希集实例(set)中移除当前数字
        // Add 方法的作用是添加当前数字于哈希集中,如果当前数字和该集合(set)元素存在重复,则返回 False 。故在此采用了逻辑非操作符(!)
        if (!set.Add(nums[i]))
            set.Remove(nums[i]); ;
    }
    //因为每个重复元素最多存在两个,而重复元素的第一个添加后均被移除,而第二个均未添加成功,故此时哈希集只保留唯一且未重复的元素
    // First*1 方法的作用是返回该序列的第一个元素
    return set.First();
}

//https://leetcode-cn.com/problems/single-number/solution/cou-yi-pian-ti-jie-hua-shuo-ti-jie-hen-hao-wan-by-/
posted @ 2022-03-22 19:32  vhuivwet  阅读(25)  评论(0编辑  收藏  举报