【Offer】[56-1] 【数组中只出现一次的两个数字】
题目描述
一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是0(1)。
思路分析
- 如果将此题改为只有一个数字出现过一次,其他数字出现两次,那么,我们就可以用异或的方式,将所有数字进行异或,最终得到的结果就为只出现过一次的数字,因为重复的数字 异或运算便会各自抵消掉;
 - 我们可以讲数组分为两组,每一组符合上面的条件,分组的方式如下:
 - 把所有的数字异或之后得到 resultExcuOR,这个异或的结果二进制中至少有一位是1,我们找出第一个为1的位置,记为n位;以数字的第n位是否为1为标准,将数组进行分组,分组得到结果符合1中条件;
 
测试用例
- 功能测试:数组中有多对重复的数字;数组中没有重复的数字。
 
Java代码
public class Offer056_01 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }
    public static void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
        Solution1(array,num1,num2);
    }
    private static void Solution1(int[] array, int[] num1, int[] num2) {
        if(array==null || array.length<2){
            return;
        }
        int resultExcuOR = 0;
        for(int i=0;i<array.length;i++){
            resultExcuOR ^= array[i];
        }
        int indexOf1 = 0;
        while( ((resultExcuOR&1)==0) && indexOf1<=4*8){
            resultExcuOR = resultExcuOR>>1;
            indexOf1++;
        }
        num1[0]=0;
        num2[0]=0;
        for(int i=0;i<array.length;i++){
            if(isBit1(array[i],indexOf1)){
                num1[0] ^= array[i];
            }else{
                num2[0] ^= array[i];
            }
        }
    }
    private static boolean isBit1(int num, int indexOf1) {
        num = num>>indexOf1;
        return (num&1)==1;
    }
    private static void test1() {
    }
    private static void test2() {
    }
    private static void test3() {
    }
}
代码链接
【Offer】[56-1] 【数组中只出现一次的两个数字】的更多相关文章
- 《剑指offer》第五十六题(数组中只出现一次的两个数字)
		
// 面试题56(一):数组中只出现一次的两个数字 // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序 // 找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度 ...
 - 剑指offer 面试题56. 数组中只出现一次的两个数字
		
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...
 - 【Java】 剑指offer(56-1) 数组中只出现一次的两个数字
		
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程 ...
 - 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
		
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
 - 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或
		
剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...
 - [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
		
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
 - [LeetCode] 421. Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
		
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
 - 剑指 offer set 18 数组中只出现一次的数字
		
题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字 思路 1. 思路是先将数组分成两个部分, 两个单个数字分别分到两部分中, 并且数组中其他数字都成 ...
 - 剑指 Offer 56 - II. 数组中数字出现的次数 II
		
题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...
 
随机推荐
- JavaFX 集成 Sqlite 和 Hibernate 开发爬虫应用
			
目录 [隐藏] 0.1 前言: 0.2 界面 0.3 Maven 环境 0.4 项目结构 0.5 整合 Hibernate 0.5.1 SQLiteDialect.java 数据库方言代码 0.5.2 ...
 - ieda控制台缓冲区限制问题
			
一.现象 控制台输出数据若超过默认值时,将从后向前取默认值大小数据(1024) 二.解决方案 1.配置文件(idea安装目录/bin/idea.properties) 2.找到该栏:idea.cycl ...
 - 又拍云叶靖:OpenResty 在又拍云存储中的应用
			
2019 年 7 月 6 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·上海站,又拍云平台开发部负责人叶靖在活动上做了<OpenRest ...
 - hadoop学习(二)----HDFS简介及原理
			
前面简单介绍了hadoop生态圈,大致了解hadoop是什么.能做什么.带着这些目的我们深入的去学习他.今天一起看一下hadoop的基石--文件存储.因为hadoop是运行与集群之上,处于分布式环境之 ...
 - kpm字符串匹配算法
			
首先是简单的朴素匹配算法 /* * 返回子串t在主串s的位置,若不存在则返回0 */ public static int index(String s, String t) { int i = 0;/ ...
 - ABAP:如何等待小数秒数
			
WAIT UP TO x SECONDS. 和CALL FUNCTION 'ENQUE_SLEEP'都只能支持整数的秒数(如果是非整数,则四舍五入),如果要WAIT非整数的描述,可以如下写法:
 - if else 深度优化
			
一. if else表达式过于复杂 if ((condition1 && condition2 ) || ((condition2 || condition3) && ...
 - 一个有趣的 5 X 5 方阵一笔画问题
			
这个问题是在我上小学时同学告诉我的,当时觉得好玩,就随便瞎画这玩儿,不过从小学到大学,没有一次画成功过.这个问题起初同学告诉我的时候,图不是这样画的,我只是为了好表达,将问题抽象成网格了,原问题是 ...
 - React Native 生命周期及相关方法小技巧使用
			
ES6 生命周期图解 很多文章里的图解,第一步是 getDefaultProps , 第二步是 getinitialstate ,这是 ES5 的写法; 实际上ES6 中 getinitialstat ...
 - scrapy学习(完全版)
			
scrapy1.6中文文档 scrapy1.6中文文档 scrapy中文文档 Scrapy框架 下载页面 解析页面 并发 深度 安装 scrapy学习教程 如果安装了anconda,可以在anacon ...