栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

查找三个数字仅出现一次

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

查找三个数字仅出现一次

您可以使用与一个和两个不同值的较简单情况类似的方式进行此操作。

每个数字位(例如32位)需要两个整数。对于每个数字,如果该位为零,则将第一个整数与其异或。如果不是,则将第二个整数与其异或。

另外,请记下在每个位置找到1或0的次数(我们只需要检查这是偶数还是奇数,因此请保留布尔值)。

迭代之后,我们的整数对将是以下之一。这里的第一个数字表示偶数,第二个数字表示奇数。

0, a^b^ca^b, ca^c, bb^c, a

对于每对,检查偶数整数。如果为零,则我们知道另一个整数是a ^ b ^ c,因为我们的结果中没有两个相等。否则,我们会在奇数计数整数处找到一个值。

public static int[] find3(int[] list) {    int[][] xors = new int[32][2];    boolean[] counts = new boolean[32];    for (int curr : list) {        for (int i = 0; i < 32; i++) { xors[i][(curr & (1 << i)) >> i] ^= curr; counts[i] ^= ((curr & (1 << i)) == (1 << i));        }    }    // this really shouldn't take so many lines    int[] ret = new int[3];    int found = 0;    for (int i = 0; i < 32; i++) {        int oddCount = xors[i][counts[i] ? 1 : 0];        int evenCount = xors[i][counts[i] ? 0 : 1];        if (evenCount != 0) { // avoid the 0, a^b^c case. if (found == 0) {     ret[0] = oddCount;// a     ret[2] = evenCount;// b^c for now     found++; } else if (found == 1 && ret[0] != oddCount) {     ret[1] = oddCount;// b     ret[2] ^= oddCount;// (b^c)^b == c     break; }        }    }    return ret;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号