找出数组中出现一次的三个数,其他数都出现两次
来源:互联网 发布:天涯明月刀心法数据 编辑:程序博客网 时间:2024/05/16 15:22
package 数组;
/*找出数组中出现一次的三个数,其他数都出现两次
讲解链接:http://zhedahht.blog.163.com/blog/static/25411174201283084246412/
f(x^a)^f(x^b)^f(x^c)结果最后一位为1的位数可以找到第一个出现一次的数
*/
public class Find3numAppearOnce {
public static void main(String[] args) {
int[]a={1,1,2,3,4,5,4};
find(a);
}
public static void find(int[]a){
int len=a.length;
if(a.length<3) return;
int xornum=0;
for(int i=0;i<len;i++){//所有数异或
xornum^=a[i];
}
int flag=0; //找到f(x^a)^f(x^b)^f(x^c)结果最后一位为1的位数
for(int i=0;i<len;i++){
flag^=f(xornum^a[i]);
}
flag=f(flag); //找到第一个出现一次的数
int first=0;
for(int i=0;i<len;i++){
if(f(a[i])==flag)
{ first=a[i];
swap(a,i,len-1);
}
}
//找出剩下的两个出现一次的数
int xor2=0;
for(int i=0;i<len-1;i++){
xor2^=a[i];
}
int flag2=f(xor2);
int second=0,three=0;
for(int i=0;i<len-1;i++){
if(isbit1(a[i],flag2)){
second^=a[i];
}else{
three^=a[i];
}
}
System.out.println(first+","+second+","+three);
}
private static void swap(int[] a, int i, int j) {
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static int f(int num){//num的最后一个1是倒数第几位
return num&(-num);
}
private static boolean isbit1(int i, int index){//数i的倒数第index位是不是1
return ((i>>index)&1)==1;
}
}
/*找出数组中出现一次的三个数,其他数都出现两次
讲解链接:http://zhedahht.blog.163.com/blog/static/25411174201283084246412/
f(x^a)^f(x^b)^f(x^c)结果最后一位为1的位数可以找到第一个出现一次的数
*/
public class Find3numAppearOnce {
public static void main(String[] args) {
int[]a={1,1,2,3,4,5,4};
find(a);
}
public static void find(int[]a){
int len=a.length;
if(a.length<3) return;
int xornum=0;
for(int i=0;i<len;i++){//所有数异或
xornum^=a[i];
}
int flag=0; //找到f(x^a)^f(x^b)^f(x^c)结果最后一位为1的位数
for(int i=0;i<len;i++){
flag^=f(xornum^a[i]);
}
flag=f(flag); //找到第一个出现一次的数
int first=0;
for(int i=0;i<len;i++){
if(f(a[i])==flag)
{ first=a[i];
swap(a,i,len-1);
}
}
//找出剩下的两个出现一次的数
int xor2=0;
for(int i=0;i<len-1;i++){
xor2^=a[i];
}
int flag2=f(xor2);
int second=0,three=0;
for(int i=0;i<len-1;i++){
if(isbit1(a[i],flag2)){
second^=a[i];
}else{
three^=a[i];
}
}
System.out.println(first+","+second+","+three);
}
private static void swap(int[] a, int i, int j) {
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static int f(int num){//num的最后一个1是倒数第几位
return num&(-num);
}
private static boolean isbit1(int i, int index){//数i的倒数第index位是不是1
return ((i>>index)&1)==1;
}
}
阅读全文
0 0
- 找出数组中出现一次的三个数,其他数都出现两次
- 数组中只有一个数出现一次,其他数都出现两次,如何找出只出现一次的那个
- 从数组中找出只出现一次的两个数,数组中其他数都出现两次
- 数组中除了三个数只出现过一次,其他的均出现过两次,请找出这三个只出现过一次的数
- 数组中有三个数只出现一次,其它的数恰好出现两次,找出这三个数。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数
- 一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。
- 只出现一次的数其他都出现两次
- 找出除一个数只出现一次外其他数都出现两次的数Single Number II
- 给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来
- 第三题,给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来。
- 一个整型数组里除了两个数之外,其他数都出现了两次。找出这两个出现一次的数。
- 数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数
- 数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数
- 找出数组中出现一次两个数,其他数字都出现偶数次
- 数组中,一个数出现一次,其余的数都出现2次,找出那个出现一次的数
- 给定一个数组,除了两个数只出现一次以外,其他数都出现了两次。
- 找出数组中出现一次的数
- 自定义view画太极图
- QT之插件Plugin生成与使用
- 利用Python进行数据分析(二)
- MVP+RxJava+Retrofit
- java之String v_1.0.1
- 找出数组中出现一次的三个数,其他数都出现两次
- 这不是赶鸭子上架么
- 设计开发前的产品原型图
- PLSQL之批量导数据
- Smallest Difference (穷竭搜索)
- TCP 文件服务器 (将服务器上的文件全部发给客户端)示例代码
- 模板的分离编译
- 【C++的探索路7】运算符重载的基本概念与赋值运算符重载
- String类的使用