首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

找出唯一的数字

懂一点位运算的知识可以巧妙的解决一些特定领域的问题。 问题描述 现在看一个比较简单的问题: 有一组整数,其中出了一个数字外,其他每个数字都出现了两次,找出这个只出现了一次的数字。...比较直接的方法就是哈希表(如果语言有原生的集合数据类型更好),速度也不满,不过空间复杂的是 的,但是往往面试官会让你在 的空间复杂度下解决问题,这时候就需要位运算登场了。...异或运算的性质 异或运算简单来说就是或运算再取反,即a xor b = not (a or b),我们可以得到: 1 ^ 0 = 1 1 ^ 1 = 0 0 ^ 0 = 0 0 ^ 1 = 1 稍微推广一下我们可以发现一个数字异或自己为得到...0,而异或0会得到自己,即a ^ 0 = a, a ^ a = 0,于是这个问题也就迎刃而解了,就是对这一组数字做一连串的异或运算,最后得到的数字就是那一个唯一只出现过一次的数字。...import reduce from operator import xor def findUnique(numbers): return reduce(xor, numbers) 总结 本文简单的介绍了异或运算的性质和一个更简单的应用

1.1K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    leetcode 找出唯一一个只出现一次的数字

    Example 1: Input: [2,2,1] Output: 1 Example 2: Input: [4,1,2,1,2] Output: 4 题目意思很简单,即找出唯一一个只出现过一次的数字...参考答案 这个题目首先我们要审清楚题干,题目明确说明了这个列表里只会有一个数字出现一次,因为多个的情况我们不用考虑。...对于这种找次数或者是找重复数字的,或者说是针对数字列表进行一些操作的,我们要有一个思维,即先想下排序是否对解题有所帮助。显然这个题目是有的。...因为这个只有一个数字只会出现一次,所以,当列表已经排好序之后,只要找到第一个符合它的下一个数字与它不相等的数字即可。...题目要求时间复杂度为线性,而排序时间复杂度为 O(logN),再循环一遍的时间复杂度为 O(N),所以总体上时间复杂度是满足题目要求的。

    56430

    找出数组中出现一次的数字

    题目要求 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。...解决方案 有以下三种解决方案: 方法一: //方法一 public int singleNumber(int[] nums){ //1.创建一个Map统计每个数字出现的次数...//那就说明当前栈中只有一个元素了,并且这个元素是最先入栈的,,并且只出现了一次 //就可以直接返回当前数字了...找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。...解决方案(进阶版本) //把所有的数字还是异或到一起,得到的结果相当于a^b //a^b一定不为0;就可以从异或结果中找到某一个为1的bit位 //要根据这个bit位对整个数组进行分组,

    23310

    【LeetCode】找出数组中重复的数字day01

    题目 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的, 但不知道有几个数字重复了,也不知道每个数字重复了几次。...请找出数组中任意一个重复的数字。...示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n <= 100000 解题思路 暴力搞,双层for循环,第一层的第一个元素和全数组比较。...则会fasle,那就将这个重复元素return 这里需要注意的是set在进行add得时候其中检查元素重复的复杂度是多少呢?...其中hashSet的add是通过HashMap的key来实现的那么我们了解一下hashMap的putVal()的源码 在put的时候我们会进行插入这个最坏复杂度也在O(n)所以也就是O(n) 将数组进行排序

    60420

    剑指offer之找出数组中重复的数字

    文章目录 找出数组中重复的数字 方法一 使用hashset 方法二 巧妙采用原地置换法 找出数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。...数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。...[i]; } hashMap.add(nums[i]); } return 0; } } hashset很简单 一个个的放入...如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。...在交换过程中,如果有重复的数字发生,那么终止返回ture 看给的示例 [2, 3, 1, 0, 2, 5, 3] 第一个是2 发现下标为2的元素和2不相等 就和下标为2的元素交换 变成[1, 3, 2,

    28310

    剑指offer(一):找出数组中重复的数字

    ❝涓滴之水终可以磨损大石,不是由于它力量强大,而是由于昼夜不舍的滴坠。——贝多芬❞ 找出数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。...数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。...解法三 长度为 n,元素的数值范围也为 n,如果没有重复元素,那么数组每个下标对应的值与下标相等。...int t = numbers[i]; numbers[i] = numbers[j]; numbers[j] = t; } } 测试用例 长度为 n 的数组中包含一个或多个重复的数字...; 数组中不包含重复的数字; 无效测试输入用例(输入空指针;长度为 n 的数组中包含 0~n-1 之外的数字)。

    65210

    找出数组中只出现一次的数字

    一个数组中,有一个数字只出现一次,其余的数都出现两次,求出那个单独的数 可以使用异或或来解决这个问题,因为两个相同的数异或之后就是0,0与一个数异或还是这个数,而且异或满足交换律 public static...{ n ^= arr[i];//与sun+=arr[i]类似,方便理解 } System.out.println(n); } 拓展: 一个数组中...,只有两个不同的数字出现一次,其余的数都出现两次,求出那两个只出现一次的数 思路:假设数组是{1,2,3,1},要想找到那两个只出现一次的数,只需要将数组里面所有的数字异或一下,得到结果sum,然后将...sum进行移位操作判断是否为1,如果不为1,依次往后,知道右移到位为1的时候为止,其实就是确定sum从右往左数第几位是1,从而起到筛选的作用, 接下来将数组遍历一遍,判断数组中的每个数是否满足移k位结果是否为...,所以在异或一个num1就可以得到num2 总结:简单来说,就是通过移位操作来达到分类的作用,接下来就是使用之前异或的方法即可 代码如下 public static int[] Search(int[]

    60530

    不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?

    偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下。 题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。...有什么更好的写法,来实现这个目的呢? 该问题下的回答挺多的,实现思路五花八门。我挑几个可读性比较好: 方法一:使用bisect模块(数字可调) ? 方法二:使用 zip() 与 next() ?...方法三:使用字典(仅适用于 Python 3.6 以上的有序字典) ? 还有其它几个回答,虽然都能实现数字分级的目的,但是其可读性要差很多,因为它们要么需要你作计算和推理,要么就是引入了额外的变量。...这是一个简单的图示例子: ? bisect库中的 bisect() 方法,查找元素 x 在一个升序序列中的插入点 i,使得插入点左侧的元素都小于等于 x,插入点右侧的元素都大于 x。...该题目的查找范围很小,所以时间效率差别不大。但是其写法称得上是 Pythonic,值得借鉴。

    93820

    漫画:神奇的找出只出现一次的数字!

    01 题目分析 第136题:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。...所以我们可以用一个很简单的逻辑“如果出现第一次就放入map中,如果出现第二次就将其删除”,最终map中剩下的唯一一个元素,就是我们要找的目标元素。...(这是专门给基础薄弱的道友准备的,懂的可以自行跳过....) 异或(xor)是一个数学运算符,它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。...(其实很好记忆,就是男的和女的才能生出孩子,如果两个男的或两个女的,那就不行...) 而异或运算,满足于交换律其实也很好理解,男的和女的,女的和男的,其实都可以生出孩子.....在上面的知识基础上,我们只需要将所有数字按照顺序做异或运算,最终剩下的数字就是唯一的数字。 因为任意两个相同的数字进行异或,结果为0 a ^ a = 0 而0和任意数字进行异或,又等于其本身。

    36820

    找出数组中的所有孤独数字(哈希)

    题目 给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1 和 x - 1)出现在数组中,则认为数字 x 是 孤独数字 。...返回 nums 中的 所有 孤独数字。你可以按 任何顺序 返回答案。...- 8 是一个孤独数字,因为它只出现一次,并且 7 和 9 没有在 nums 中出现。 - 5 不是一个孤独数字,因为 6 出现在 nums 中,反之亦然。...因此,nums 中的孤独数字是 [10, 8] 。 注意,也可以返回 [8, 10] 。...- 5 是一个孤独数字,因为它只出现一次,并且 4 和 6 没有在 nums 中出现。 - 3 不是一个孤独数字,因为它出现两次。 因此,nums 中的孤独数字是 [1, 5] 。

    46230

    不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?

    偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下。 题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级。...有什么更好的写法,来实现这个目的呢? 该问题下的回答挺多的,实现思路五花八门。我挑几个可读性比较好: 方法一:使用bisect模块(数字可调) ? 方法二:使用 zip() 与 next() ?...方法三:使用字典(仅适用于 Python 3.6 以上的有序字典) ? 还有其它几个回答,虽然都能实现数字分级的目的,但是其可读性要差很多,因为它们要么需要你作计算和推理,要么就是引入了额外的变量。...这是一个简单的图示例子: ? bisect库中的 bisect() 方法,查找元素 x 在一个升序序列中的插入点 i,使得插入点左侧的元素都小于等于 x,插入点右侧的元素都大于 x。...该题目的查找范围很小,所以时间效率差别不大。但是其写法称得上是 Pythonic,值得借鉴。

    48930

    起个简单枯燥的标题:找出连续差相同的数字

    大家好,我是吴师兄,今天懒得起标题,所以标题就直接以题目命名(逃 题目描述 返回所有长度为 N 且满足其每两个连续位上的数字之间的差的绝对值为 K 的非负整数。...请注意,除了数字 0 本身之外,答案中的每个数字都不能有前导零。例如,01 因为有一个前导零,所以是无效的;但 0 是有效的。 你可以按任何顺序返回答案。...示例 1: 输入:N = 3, K = 7 输出:[181,292,707,818,929] 解释:注意,070 不是一个有效的数字,因为它有前导零。...另外这个题还有一个特征,就是当你确定了最左边的那一位上的值后,后面的位就可以顺推。...确定了一位,推导下一位无非有两种情况 比当前位上的值大 K; 比当前位上的值小 K。 另外对位上的值也有限制,不能超过 9,也不能小于 0。 知道了上面的这些后,剩下的就是去实现一个递归函数。

    69120

    如何快速找出数组中出现一半以上的数字

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。...2 幸存者(候选者)算法 我给这个算法起了一个比较有趣的名字,叫做幸存者(候选者)算法。...基本的思路是,在遍历数组过程中,每次找到一对不相等的数,给砍掉,最后活下来的幸存者就是有可能是整个数组中出现的次数超过数组长度的一半的那个数。...而且只需要遍历一遍数组就能够知道那个幸存者是哪个数字。 我们准备两个变量,cand和times,cand为候选数字,而times表示候选数字出现的次数。...10)最后候选人为2,2就有可能是整个数组中出现的次数超过数组长度的一半的那个数 11)重新遍历一遍数组,看看2是不是真的是整个数组中出现的次数超过数组长度的一半的那个数 很明显,只需要两个变量就能完成这个任务

    90720
    领券