剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字

 1 /*************************************************************************
 2     > File Name: 38_NumbersAppearOnce.cpp
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年09月03日 星期六 10时50分32秒
 6  ************************************************************************/
 7
 8 #include <stdio.h>
 9
10 // 判断数字二进制从右往左第index位是不是1
11 bool isBit(int num, int index)
12 {
13     num = num >> index;
14     return (num & 1);
15 }
16
17 // 所有数字出现两次,只有两个出现了一次,找出这两个数字
18 void FindNumsAppearOnce(int* nums, int length, int* num1, int* num2)
19 {
20     if (nums==NULL || length<=2)
21         return;
22
23     int temp = nums[0];
24     // 第一遍异或
25     for (int i = 1; i < length; ++i)
26         temp ^= nums[i];
27
28     // 从右向左寻找temp二进制第几位是1
29     int index = 0;
30     while ((temp & 1) == 0)
31     {
32         temp = temp >> 1;
33         ++ index;
34     }
35
36
37     *num1 = 0;
38     *num2 = 0;
39
40     // 分组异或
41     for (int i = 0; i < length; ++i)
42     {
43         if (isBit(nums[i], index))
44             *num1 ^= nums[i];
45         else
46             *num2 ^= nums[i];
47     }
48 }
49
50 int main()
51 {
52     int nums[] = {2,4,3,6,3,2,5,5};
53     int length = 8;
54     int num1 = 0;
55     int num2 = 0;
56     FindNumsAppearOnce(nums, length, &num1, &num2);
57     printf("num1 is %d\nnum2 is %d\n", num1, num2);
58     return 0;
59 }
时间: 2024-10-03 03:01:42

剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字的相关文章

剑指Offer40:数组中只出现一次的数字(Java)

参考hezhiyao的博客 https://www.cnblogs.com/hezhiyao/p/7539024.html 参考qmss的博客 https://www.jianshu.com/p/c308e4a1e19f 参考Raise的博客 https://blog.csdn.net/linraise/article/details/9425319 思路分析: 利用两个相同的数异或为0的性质,两个不为零且不同的数异或运算结果的二进制形式一定有1的性质 解题步骤: 1. 把数组从左到右全部异或运

剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

/*一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. */ import java.util.*; public class Class45 { public void FindNumsAppearOnce(int[] array, int num1[], int num2[]){ ArrayList<Integer> list = new ArrayList<Integer>(); Arrays.sort(array); for(int

剑指offer数组3

面试题11:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 考察对二分查找的理解 1. 定义两个指针.第一个 index1 指向第一个元素,第二个 index2 指向最后一个元素. 2. 数组的中间元素 indexMid.如果该中间元素位于前面的递增

C语言实现一个int类型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数字

题目是这样叙述的:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字. 要求:时间复杂度为O(N),空间复杂度为O(1). 请看我的分析:将这道题简单化:一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A:我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字.不会的可看本人(2019-04-04)那天的博客 如果这个数组中出现两个不同的数字,而其他数字均出现两次

一个整型数组里除了两个不同数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。

曾经做过一道水题找出除了一个数字之外,其他数字都有2个.直接异或 最后结果就是那个数. 现在变成存在2个不一样的数字,假设成x,y,那么可以O(n)求出x^y,因为x,y不同,所以异或的结果不为0,看成2进制数,那么找到第一位为1 的位置,将这个位置设置为划分点,数组里所有这个位置为1 的异或一次,所有为0的再异或一次,最终求出的两个即为两个独特的数字. #include <stdio.h> #include <string.h> #include <algorithm>

一个数组中,一些数出现2次,只有两个数各出现一次,找出这两个数

https://leetcode.com/problems/single-number-iii/ 初次看到这题时,就想到用异或,但只能找出这两个数异或的结果,不能找出这两个数.最后我用快排过了,然后去看了看人家的思路.看来还是得仔细分析其中的隐藏信息啊.比如:从这两个数异或后的结果值可以看出,从低位开始到某一位不为0时,一定是这两个数的二进制位在此时不同了(从低位开始一定可以找到一个不为0的,因为这两个数不同).这个位可以用树状数组的lowbit方法将异或值与此值的负数进行异或求出.然后将这个数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 示例 1: nums1 = [1, 3] nums2

逻辑题(一)一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。

package test; import java.util.*; public class test17 { public static void main(String[] args) { //一个整型数组里除了两个数字之外,其他的数字都出现了两次. // 请写程序找出这两个只出现一次的数字. int[] ints = {1,1,2,5,5,6,3,3}; Map<Integer, Integer> map = new HashMap<Integer, Integer>();

有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数

有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数 描述:有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数.1.位图的方法:假设待处理数组为A[10w-2]定义一个数组B[10w],这里假设B中每个元素占用1比特,并初始化为全0for(i=0;i <10w-2;i++){ B[ A[i] ]=1}那么B中为零的元素即为缺少的数据这种方法的效率非常高,是计算机中最常用的算法之一2.首先计算1到10w的和,平方和. 然后计算给定数字的和,平方和. 两次的到的数字相减,可以得