如果数组中只一个数字是只出现一次的,其他数字都是成双成对出现的,那么我们从头到尾依次异或数组中的每个数字,最终的结果刚好就是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。...那么回到我们的题目,因为有两个只出现一次的数字,所以我们可以试着把原数组分成两个子数组,使得每个数组包含一个只出现一次的数字,而其他数字都成对出现两次。...我们还是从头到尾依次异或数组中的每个数字,那么最终得到的结果就是两个只出现一次的数字异或的结果。...位都为1,第二个子数组中的数组第index位都为0,那么只出现一次的数字将被分配到两个子数组中去,于是每个子数组中只包含一个出现一次的数字,而其他数字都出现两次。...这样我们就可以用之前的方法找到数组中只出现一次的数字了。
一个数组中,有一个数字只出现一次,其余的数都出现两次,求出那个单独的数 可以使用异或或来解决这个问题,因为两个相同的数异或之后就是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[]
链接: 数组中数字出现的次数 ---- 该题是“消失的数字”的进阶版,还没接触的读者可以先看这个: 链接:消失的数字 ---- 思路: 我们依然使用异或的方法,只不过这道题需要查找的是两个数字,所以我们得先找到这两个数字的异或数字...: 首先将数组nums中的数字异或一遍,得到的就是只出现一次的数字的那两个数字的异或数字。...又因为该题要求要将returnSize改成只出现一次的数字,这里比较简单,就是两个嘛。...所以我们想到一个方法找到这两个数字: 在 n 的二进制位中从右到左,找到第一位为1的位数,然后记下这个位为 j,接着把 nums 中的所有数依次判断,若在 j 位为1则放到一个数组中,为0则放到另一个数组中...以这里例一为例,我们上面求出n等于0111,那么第一位为1的就刚刚好是第一位,然后把nums数组中第一位为1的放到一个数组,为0的放到另一个数组中去。
一,数组中数字出现的次数II 1,问题描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。....findFirst() .get() .getKey(); } } 5,总结一下 对于本题,整体最容易理解的思路就是基于键值对集合...hashmap进行解决了 历史文章目录 数据结构:王同学下半年曾写过的JDK集合源码分析文章汇总 算法汇总:leetcode刷题汇总(非最终版) ?
链接: 数组中数字出现的次数2 这道题是前一次博客的另一个版本,想看上一个的链接在下面: 链接: 数组中数字出现的次数1 ---- 这道题与上道题不太一样的是这里出现的次数是3次还有1次的,所以异或的方法不太好整...我们想,既然这个数组里面只有一个数字是出现一次,其他是三次,那用一个数组把这些出现三次的数字,把他们每个二进制位统计并相加,会发现这个统计的数组中的每个位的数字都会是3的倍数,那如果又多了一个出现一次的数...,那他某个二进制位上统计完加上去,会让这个数组里面某个位的数字变成模3余1,那么就可以找出这个数字为1的进制位,最后再用二进制的运算求出这个数字。...总的来说: 统计出数组中的所有的数,从第1位到第32位进制位有多少个1,然后找到数组中模3余1的位数,就是这个出现一次的数字的二进制位为1的位数。...j) & 1) == 1) { arr[j] += 1; } } } //看看哪一位是出现一次的
题目: 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
数组中只出现一次的数字 Desicription 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。...map计数,显然不是最优的 2,本题的特点,只有一个只出现了一次,且这个整数,只有31位 3,我们统计整个数组中,1到31位,1的个数,如果mod 3 不是0 说明只出现一次的数据,这一位非零 4,...=0{ res|=1<<i } } return res } 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。...,其它的元素都出现两次. 1,全部元素异或消掉出现两次的数字....因为异或值s中的bit1就是因为两个数字的不同而贡献的. 4,同一组的元素再异或求出不同数字. 出现两次的数字, 肯定出现同一组, 异或后消除掉. */
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...解题思路 我们利用异或的特性,异或两个相同的数字的结果为零,第一遍对数组进行异或的结果是 两个只出现一次的数字的异或值(a^b),并不是我们想要的,所以我们根据这个异或值找到一位为1的位数 (a和b的这个位上的值肯定是不相同的...),按照原始数组中所有数字的这个位是否为1分成两组,这样两组里面有且仅有一个只出现一次的数字,然后再次异或,就能得到a和b 代码 class Solution { public: void FindNumsAppearOnce...(vector data,int* num1,int *num2) { //对数组中的数字进行异或 int xorresult=data[0];...}else{ isone.push_back(data[i]); } } //每组就只有一个只出现一次的数字了
概要 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...方法一:遍历数组,第一次遍历的直接存入list,第二次再遍历到了就移除,将剩下的两个元素填到数组里; public void FindNumsAppearOnce(int [] array,int...0^X=X 此题用了两次异或运算特点: (1)第一次使用异或运算,得到了两个只出现一次的数相异或的结果。 (2)因为两个只出现一次的数肯定不同,即他们的异或结果一定不为0,一定有一个位上有1。...另外一个此位上没有1,我们可以根据此位上是否有1,将整个数组重新划分成两部分,一部分此位上一定有1,另一部分此位上一定没有1,然后分别对每部分求异或,因为划分后的两部分有这样的特点:其他数都出现两次,只有一个数只出现一次...因此,我们又可以运用异或运算,分别得到两部分只出现一次的数。
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...实例 输入 [92,3,43,54,92,43,2,2,54,1] 输出 3,1 思路以及解答 HashMap存储出现次数 使用hashmap存储数字出现的次数,key为出现的数字,value为该数字出现的次数...遍历完成之后,需要将次数为1的数字捞出来,同样是遍历hashmap,由于只有两个满足条件,我们设置一个标识变量,初始化为1,如果找到第一个满足条件的数字,除了写入放回数组中,还需要将该标识置为2,表示接下来找的是第...假设里面出现一次的两个元素为A和B,初始化异或结果res为0,遍历数组里面所有的数,都进行异或操作,则最后结果res = A^B。...那我们取出异或结果res最低位的1,假设这个数值是temp(temp只有一个位是1,也就是A和B最后不同的位) 遍历数组中的元素,和temp进行与操作,如果和temp相与,不等于0。
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...思路 思路一: 利用HashSet的元素不能重复,如果有重复的元素,则删除重复元素,如果没有则添加,最后剩下的就是只出现一次的元素 思路二: 用HashMap保存数组的值,key为数组值,value为布尔型表示是否有重复...package Array; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; /** * 数组中只出现一次的数字...* 一个整型数组里除了两个数字之外,其他的数字都出现了两次。...请写程序找出这两个只出现一次的数字。 * num1,num2分别为长度为1的数组。
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。...输出:4 示例 2: 输入:nums = [9,1,7,9,7,9,7] 输出:1 限制: 1 <= nums.length <= 10000 1 <= nums[i] < 2^31 设置一个数组代表...32位,每一位代表当前所有数组中当前位出现次数之和。
位运算、哈希表 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...解法1 遍历数组,用map保存出现的次数,再找到次数为1的数 class Solution { public: void FindNumsAppearOnce(vector data,...,那么他们异或的结果为0 所以将所有数字异或,结果就是两个只出现一次的数字异或的结果 那么如何分离这两个数字呢 异或结果为1时,两个数字里对应的位肯定为1和0,所以找到异或结果为1的位置ret...:所有数组异或–>和反码与得到1的位置–>和每个数字与判断–>对应再异或 class Solution2 { public: void FindNumsAppearOnce(vector<int...) { int ret = 0; for (const int k : data) ret ^= k; ret &= (-ret); //找ret二进制中为
本文链接:https://blog.csdn.net/weixin_42449444/article/details/90031112 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次...请写程序找出这两个只出现一次的数字。...解题思路: 用map来记录每个数字出现的次数,无脑遍历data,然后再对map进行for-each去寻找只出现过一次的那俩个数时,找到后分别记录在*num1和*num2中。
题目 给你一个下标从 0 开始的整数数组 nums ,同时给你一个整数 key ,它在 nums 出现过。 统计 在 nums 数组中紧跟着 key 后面出现的不同整数 target 的出现次数。...换言之,target 的出现次数为满足以下条件的 i 的数目: 0 <= i <= n - 2 nums[i] == key 且 nums[i + 1] == target 请你返回出现 最多 次数的...测试数据保证出现次数最多的 target 是唯一的。...没有其他整数在 key 后面紧跟着出现,所以我们返回 100 。...对于 target = 3 ,在下标 4 出出现过 1 次,且紧跟着 key 。 target = 2 是紧跟着 key 之后出现次数最多的数字,所以我们返回 2 。
个数 剑指offer | 面试题33:连续子数组的最大和 剑指offer | 面试题34:1~n 整数中 1 出现的次数 剑指offer | 面试题35:把数组排成最小的数 剑指offer | 面试题36...数组中数字出现的次数 “题目描述 :一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。...x⊕y首位1,记录 于m中,代码如下: 拆分nums为两个子数组: 分别遍历两个子数组执行异或: 通过遍历判断nums中格数字和m做与运算的结果,可将数组拆分为两个子数组,分别对两个子数 组遍历求异或,...返回出现一次的数字 } } 剑指 Offer 56 - II. 数组中数字出现的次数 “题目描述 :在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。...map中,其中key存储的是当前数字,value是 //数字的出现的次数 for (int num : nums) { map.put(num,
题目描述 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...示例1 输入 [1,4,1,6] 返回值 [4,6] 说明 返回的结果中较小的数排在前面 思路: 1.首先全数组异或找出这个数组中不同的两个数字的异或结果 initNum 原理:相同数字的异或结果为0...,利用两个数字在此位置上必然是一个是0一个是1,我们可以利用与特性区分这两个数字的位置.另外其他相同数字不管落在数组中哪个位置上,两个相同数字的异或结果必然是0,因此最后落到我们数组中的必然两个不同的数字...//先亦或一波,求出数组中只出现过一次的数字的亦或结果 int initNum=array[0]; for (int i = 1; i < array.length...2个元素最终会抵消了,剩下的是只出现过一次的且&one等于0的; if ((one&array[i])==0){ res[0]^=array[i]
领取专属 10元无门槛券
手把手带您无忧上云