LeetCode136. 只出现一次的数字

力扣链接:https://leetcode.cn/problems/single-number/description/

题目叙述

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

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

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

输入:nums = [1]
输出:1

提示:

1 <= nums.length <= 3 * 10^4
-3 * 10^4 <= nums[i] <= 3 * 10^4
除了某个元素只出现一次以外,其余每个元素均出现两次。

思路:

题目要求我们使用常量级别的额外空间来实现,故而使用哈希表来计数的方法被排除了,那么,我们还能去怎么做这道题目呢?——我们可以采用异或运算的性质

异或运算的性质

  • N^0=0 ,如何去解释呢?我们我都知道异或运算的规则是相同为0,不同则为1,那么我们一个数N,如果它的某一位为1,那么与0做异或,结果为1,如果这一位为0,那么与0做异或还是0,故而一个数与0做异或的结果就是它本身。

  • N^N=0,异或的运算规则是相同为0,不同为1,那么我们可以知道N和N做异或运算,它的每一位数字都相同,所以说每一位的运算结果都是0,那么结果一定也是0。

  • 异或满足交换律和结合律

因为题目中说只有一个数字出现了一次,其余数字均出现了两次,那么我们只需要设置一个result变量,初始化为0,对数组中的每一个元素都做一次异或运算,那么最后得到的结果一定是那个成单出现的数字

因为异或满足交换律,我们可以将成对的数字先进行异或操作,得到的结果为0,那么最后那个单个出现的数字,对0进行异或,结果就是那个数字

C++示例代码如下:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int result=0;
        //基于范围的for循环
        for(auto &it :nums){
            result^=it;
        }
        return result;
    }
};
posted @ 2024-07-23 10:11  Tomorrowland_D  阅读(8)  评论(0编辑  收藏  举报