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 @   Tomorrowland_D  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示