前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【剑指Offer】56.1 数组中只出现一次的数字,其他出现2次

【剑指Offer】56.1 数组中只出现一次的数字,其他出现2次

作者头像
瑞新
发布2020-12-07 10:11:49
3200
发布2020-12-07 10:11:49
举报
文章被收录于专栏:用户3288143的专栏

NowCoder

题目描述

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

解题思路

两个不相等的元素在位级表示上必定会有一位存在不同,将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。

diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。

x ^ y = z 互相异或可以得到另一个数

diff &= -diff; 快速找到为1的不同位 -42的补码为11010110(00101010按位取反11010101+1即11010110)

代码语言:javascript
复制
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int[] nums, int num1[], int num2[]) {
        int diff = 0;
        for (int num : nums)
            diff ^= num;
        diff &= -diff;
        for (int num : nums) {
            if ((num & diff) == 0)
                num1[0] ^= num;
            else
                num2[0] ^= num;
        }
    }
}
代码语言:javascript
复制
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int[] nums, int num1[], int num2[]) {
        int diff = 0;
        for (int num : nums)
            diff ^= num;
        int index = 0;
        // 找到sum为1的位数
        while((diff >> index & 1) == 0) index++;
        
        int first = 0;
        for(int i : nums)
            if((i >> index & 1) == 0) 
                first ^= i;
        int second = diff ^= first;
        
        num1[0] = first;
        num2[0] = second;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档