数组中只出现一次的数字

本贴最后更新于 2614 天前,其中的信息可能已经事过境迁

题目描述

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

num1,num2分别为长度为1的数组。传出参数 将num1[0],num2[0]设置为返回结果

解题思路

两种方法:

  • 只能遍历一次

    • 维护一个 list 或者 map,记录本数字是否只出现一次。
  • 不能创建新空间,或者空间复杂度为 O(1)。

    • 数组中所有数字异或,最后的结果是两个数字的异或。

    • 然后把结果数字转换成二进制,二进制中找到一个 1 的位置 N,说明两个数字一个在位置 N 是 1,另一个在位置 N 是 0

    • 然后对数组中位置 N 是 1 的所有数字进行异或,得到数字 1

    • 再对数组中位置 N 是 0 的所有数字异或,得到数字 2

    空间复杂度 O(1),时间复杂度 O(2n)。

代码

public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int tmp = 0; num1[0] = 0; num2[0] = 0; for (int i = 0; i < array.length; i++) tmp ^= array[i]; int index = findFirstBitIs(tmp); for (int i = 0; i < array.length; i++) if (isBit(array[i], index)) num1[0] ^= array[i]; else num2[0] ^= array[i]; } public int findFirstBitIs(int num){ int indexBit = 0; while(((num & 1)==0) && (indexBit)<8*4){ num = num >> 1; ++indexBit; } return indexBit; } public boolean isBit(int num,int indexBit){ num = num >> indexBit; return (num & 1) == 1; } }

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...