🗒️只出现一次的数字
2024-11-2
| 2024-12-1
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Nov 1, 2024 11:49 AM

一、136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
针对这个问题,我们可以使用异或位运算来解决。异或位运算是,相同为 0,不同为 1。因此,出现两次的数字,会都变为 0,留下来的就是出现一次数字的。

二、137. 只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
 
追问: 一个数组,其中一个数字出现一次,其余出现 K 次(K为大于 1 的奇数),找出只出现一次的数字。──如上

三、260. 只出现一次的数字 III

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
这个需要遍历两次,第一次得到的数字,是两个只出现一次元素的异或值。我们可以找到这个数字第一个 1 出现的位置,也就是两个只出现一次元素第一次出现不同的位置。我们以这个为判断点,可以把数组分为两组,这两个数字就会被分开。
注意:需要防止溢出

位运算扩展

异或:相同为 0,不同为 1。也可用「不进位加法」 来理解。
异或操作的一些特点:

实战常用的位运算操作

更为复杂的位运算操作

  1. 将x最右边的n位清零:x & ( ~0 << n )
  1. 获取x的第n位值(0 或者 1):( x >> n ) & 1
  1. 获取x的第n 位的幂值:x & ( 1 << ( n - 1 ))
  1. 仅将第n位置为1:x | ( 1 << n)
  1. 仅将第n位置为0:x & ( ~( 1 << n ))
  1. 将x最高位至第n位(含)清零:x & (( 1 << n) - 1 )
  1. 将第n位至第0位(含)清零:x & ( ~(( 1 << ( n + 1)) - 1))

📎 参考

 
  • 面试题
  • 199. 二叉树的右视图基于数组实现一个大顶堆,并提供添加元素和删除堆顶元素的操作
    Loading...