挑战做100道力扣算法- DAY1

136. 只出现一次的数字 - 力扣(LeetCode)

hot100里的简单题

我们先来复习一遍与或非:

  • 与(AND) :符号 && 或 &,两个操作数都为真时结果为真
  • 或(OR) :符号 || 或 |,至少一个操作数为真时结果为真
  • 非(NOT) :符号 !,真变假,假变真
  • 异或(XOR) :符号 ^,两个操作数不同时为真,相同时为假

异或运算有几个重要性质:

  1. 任何数与 0 异或等于它本身:a ^ 0 = a
  2. 任何数与自身异或等于 0:a ^ a = 0
  3. 异或运算满足交换律和结合律:a ^ b = b ^ a,(a ^ b) ^ c = a ^ (b ^ c)

参考代码:

java 复制代码
class Solution {
    public int singleNumber(int[] nums) {
        int n = nums.length;
        int ret = 0;
        for(int i = 0; i <= n - 1; i++){
            ret = ret ^ nums[i];
        }
        return ret;
    }
}

这段代码利用了异或运算的性质来找出数组中只出现一次的数字:

  1. 初始化 ret = 0
  2. 遍历数组,对每个元素执行异或操作
  3. 由于异或运算满足交换律和结合律,所有出现两次的数字都会相互抵消为 0
  4. 最终剩下的就是只出现一次的数字

例如数组 [4, 1, 2, 1, 2]:

  • 0 ^ 4 = 4
  • 4 ^ 1 = 5
  • 5 ^ 2 = 7
  • 7 ^ 1 = 6
  • 6 ^ 2 = 4 ← 最终结果

时间复杂度 O(n),空间复杂度 O(1)。

相关推荐
一去不复返的通信er5 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
考研保研资料分享7 小时前
985工科跨保上财应用统计:数学笔试、匿名面试与机试复盘
面试·职场和发展
程序 代码狂人8 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade9 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Xin77010 小时前
LeetCode 79. 单词搜索(DFS 回溯法)
leetcode
小郎君65811 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一11 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10011 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao12 小时前
算法56,重排链表
数据结构·算法·链表