2021-01-21

这篇博客介绍了如何使用位运算快速找到数组中只出现一次的数字。通过定义seen_once和seen_twice变量,利用按位与、按位取反和按位异或运算,可以在遍历数组的过程中动态更新这两个变量,最终seen_once会存储只出现一次的数字。这种方法巧妙地利用了位运算的性质,实现了高效求解。
摘要由CSDN通过智能技术生成

Day 1.21

只出现一次的数字(Ⅱ)

题目

在这里插入图片描述

思路(1)

同(Ⅰ)遍历后查找,代码完全不变

思路(2)(位运算答案)

引入运算符:
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 ;
~ 按位取反运算符:将参与运算的数每位取反,1变0,0变1;

定义变量:
seen_once: 保存出现一次的元素,确保所有三个的元素作用的结果对只出现一次的元素无影响
seen_twice:保存出现两次的元素

定义运算规则:
seen_once = ~seen_twice & (seen_once ^ x);
seen_twice = ~seen_once & (seen_twice ^ x);

对每一个元素x:

  • 第一次出现时,seen_once 为 0,seen_twice 为 0,导致 seen_once 被更新为 x,seen_twice依旧是 0;
  • 第二次出现时,seen_once 被更新为 0,seen_twice 更新为 x;
  • 第三次出现时,seen_once 保持为 0,seen_twice 更新为 0;

因此,所有出现三次的元素都不会改变 seen_onceseen_twice 的值,而仅出现一次的元素x会使得 seen_once 会被更新为x,对 seen_twice 则无影响。所以最终 seen_once 中存储的就是只出现一次的元素。

代码

class Solution {
public int singleNumber(int[] nums) {
        int seen_once = 0, seen_twice = 0;
        for(int i: nums) {
            seen_once = ~seen_twice & (seen_once ^ i);
            seen_twice = ~seen_once & (seen_twice ^ i);
        }
        return seen_once;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值