美文网首页奇妙的位运算
位运算之两个孤立的数问题(hihocoder)

位运算之两个孤立的数问题(hihocoder)

作者: 掌灬纹 | 来源:发表于2019-01-24 21:46 被阅读0次

题目:

一个整型数组里除了两个数字(互不相同)之外,其他的数字都出现了两次。

请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

输入

第一行:数组的长度N(1<n<100000)

第二行:N个整数,空格隔开

输出

只出现了1次的那两个数,小的在前大的在后,空格隔开

样例输入

10

5 5 6 7 9 9 7 3 3 2

样例输出

2 6

思路:

1.已知把一个数组内元素遍历异或运算后,会消去里面相同的数(之前解释过),显然

当数组里有两个单独的数时,遍历异或肯定得不到两个解,但会得到一个不为零的解。

2.易知该解的二进制一定至少有一位为1,即可用这一位来控制将原数组分开做异或运算,

最终将得到这两个孤立的数。

3.与一个数二进制第一个1做比较操作,可以简单设置一个flag 整型标记,初值为1,通过

while循环 不断进行 flag >>= 1,操作找到该位置。在通过flag将数组分开运算。

(Java语言描述)

import java.util.Scanner;

public class Main{

public static void main(String[] args) {

int min = 0;

int max = 0;

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

int[] arr = new int[n];

for(int i = 0; i < arr.length; i++) {

int num = sc.nextInt();

arr[i] = num;

}

int temp = 0;//遍历异或 后那个标尺数

for(int i = 0; i < arr.length; i++) {

temp = temp^arr[i];

}

int flag = 1;//第一个不同的1

while((flag&temp) == 0) {

flag = flag << 1;

}

for(int i = 0; i < arr.length; i++) {

if((flag & arr[i]) == 0) {//表示在该位置上二者不同

min = min^arr[i];

}else {

max = max^arr[i];

}

}

int temp1 = 0;

if(max < min) {

temp1 = max;

max = min;

min = temp1;

}

System.out.println(min+" "+max);

}

}

相关文章

  • 位运算之两个孤立的数问题(hihocoder)

    题目: 一个整型数组里除了两个数字(互不相同)之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。...

  • 位运算之特殊的分配问题(hihocoder)

    地产大亨Q先生临终的遗愿是:拿出100万元给X社区的居民抽奖, 以稍慰藉心中愧疚。 麻烦的是,他有个很奇怪的要求:...

  • 位运算之两个数转换进制改变问题(hihocoder)

    题目: 给定两个整数A和B, 需要改变几个二进制位才能将A转为B。 样例输入 10 8 样例输出 1 思路: 改变...

  • Java位运算符与移位运算符

    位运算符 位运算符主要针对两个二进制数的位进行逻辑运算,它包括:与(&)、或(|)、非(~)、异或(^)**运算规...

  • Java运算符

    &(按位与运算符) &(按位与)的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)...

  • Java 位运算符

    位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。位运算符主要针对两个二进制数的位进行逻辑运算。...

  • 位运算之找到重复的数

    /** * 题目:1-100 放在大小为101的数组中, * 只有一个可重复元素,每个数组元素只能访问一次 * 且...

  • JAVA运算符

    1、&(按位与) &按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)1&1...

  • 位运算符如何理解

    1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均...

  • C语言08- 位运算,宏定义,递归

    16:位运算 16.1:位运算概述 二进制与位运算 16.2:与(and):& 与运算:只有当2个数对应的位都为1...

网友评论

    本文标题:位运算之两个孤立的数问题(hihocoder)

    本文链接:https://www.haomeiwen.com/subject/lyzujqtx.html