周其仁:停止改革,我们将面临三大麻烦

抛开立场观点不谈,且看周小平写一句话能犯多少语病

罗马尼亚的声明:小事件隐藏着大趋势——黑暗中的风:坚持做对的事相信未来的结果

布林肯突访乌克兰,为何选择去吃麦当劳?

中国不再是美国第一大进口国,贸易战殃及纺织业? 美国进一步延长352项中国商品的关税豁免期

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

数组中只出现一次的数字

顶级算法 2022-07-01
关注顶级算法修炼内功
顶级算法后台回复 1024 有特别礼包

责编:顶级算法 |xialu

链接:jianshu.com/p/079ed529e1ca

上一篇精彩:数据结构的三要素

大家好,我是顶级算法。
排序序列:
1、程序员必知必会的排序一:冒泡排序2、程序员必知必会的排序二:快速排序3、程序员必知必会的排序三:直接插入排序4、程序员必知必会的排序四:希尔排序5、程序员必知必会的排序五:拓扑排序6、程序员必知必会的排序六:选择排序
题目描述:

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

示例 2:

输入:nums = [-1,0]
输出:[-1,0]

示例 3:

输入:nums = [0,1]
输出:[1,0]

思路:

利用异或的原理,AA=0,A0=A.也就是一个数异或它本身等于0,0异或任何数都等于这个数本身.设数组中两个只出现一次的数字为a,b.则数组中所有元素进行异或得到的结果为c,c=a^b;将c转换成2进制,从右往左寻找第一个为1的位数index.因为异或相异为1.所以a,b的index位不同.根据这一点,将数组分隔成只出现一次数字a和只出现一次数字b的两部分.再分别异或.得到的结果也就是a,b本身.

另外搜索公众号顶级架构师后台回复“offer”,获取一份惊喜礼包。

代码实现:
class Solution {
    public int[] singleNumber(int[] input) {
 // 结果数组.
        int[] arr = new int[2];
        int result = 0, index = 0;
        // 设只出现过一次的数字为A,B. result=A^B;
        for (int i = 0; i < input.length; i++) {
            result ^= input[i];
        }
        // 从右往左遍历查找A,B第一个不同的二进制位.
        while ((result & 1) == 0) {
            result = result >>> 1;
            index++;
        }
        // 将数组分为包含A与包含B的两部分.
        for (int num : input) {
            if (((num >>> index) & 1) == 0) {
                arr[0] ^= num;
            } else {
                arr[1] ^= num;
            }
        }
        return arr;
    }
}


觉得不错?欢迎转发分享给更多人

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

👆扫码回复【面试题】即可获取👆



公众号后台回复 算法 或者 算法心得 有惊喜礼包!顶级算法交流群

 「顶级算法」建立了读者算法交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。

扫描添加好友邀你进算法群,加我时注明姓名+公司+职位】


版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

往日分享:

五大基本算法之分治算法

如何有效地做算法题?算法分析的正确姿势字节二面,让写一个LFU缓存策略算法,懵了
HTTPS加密算法和过程五分钟彻底理解一致性哈希算法
紧急!Log4j爆核弹级漏洞,公司炸锅了...
红黑树、B树、B+树各自适用的场景
搜索二叉树,完全二叉树,平衡二叉树的判断
常见加密算法原理及概念

文章有问题?点此查看未经处理的缓存