用java实现异或操作

最近看了博客园的很多应届生面试bae成功的经历,由衷的佩服和满满的感叹:付出总有回报。于是自己也心痒痒想找几分面试题目做做。无意间看到了这道题目。

一个数组存放了2n+1个整数,其中有n个数出现了2次,1个数出现了1次,找出出现1次的数是多少?

我想了很久没想出来,可见我很笨,百度了下答案,说只要对所有数异或一遍即可。恍然大悟,于是马上想在java上实现一下。不料结果根本不是正确的。一直以为是自己写错代码了,还百度了下异或的符号^到底对不对,符号是对了,可是度娘说java没有二进制类型,唯一跟二进制搭上边的,只有把int转成string来勉强表示二进制数。这可如何是好,对于我这种菜鸟来说,觉得何不自己定义一个Binary类呢?几经波折,终于还是出来啦!

 1 package com.test.main;
 2
 3 public class Binary {
 4
 5
 6     //define a binary instance
 7     private String binary;
 8     //接收int类型,转换成String;
 9     Binary(int a){
10         this.binary=Integer.toBinaryString(a);
11     }
12     //接收String类型的二进制,用于构造Binary对象
13     Binary(String s){
14         this.binary=s;
15     }
16
17     public Binary xor(Binary x){
18         String anotherBinary=x.binary;
19         String thisBinary=this.binary;
20         String temp;
21         String result;
22         int length;
23         length=thisBinary.length()-anotherBinary.length();
24         // keep thisBianry‘s length  is not shorter than anotherBnary;
25         if(length<0){
26             temp=thisBinary;
27             thisBinary=anotherBinary;
28             anotherBinary=temp;         length=-length;
29         }
30         31         //截取较长字符串多出来的那一段
32          if(length>0){
33              result=thisBinary.substring(0, length);
34          }
35          else{
36              result="";
37          }
38          for(int i=0;i<anotherBinary.length();i++){
39              //如果相同位置数相同,则补0,否则补1
40              if(thisBinary.charAt(i+length)==anotherBinary.charAt(i))
41              result+="1";
42              else{
43                  result+="0";
44              }
45          }
46         //构造Binary对象
47          Binary b=new Binary(result);
48
49         return b;
50
51     }
52 }

以上为为定义的二进制class,能实现异或操作,其实其他的与和并操作都可以实现,在此不累赘了。

1     public static void main(String[] args) {
2         int[] arr={1,1,2,2,3,3,4,4,4,4,5,5,6,6,7,7,8,8,8};
3         Binary sum=new Binary(arr[0]);
4         for(int i=1;i<arr.length;i++){
5             sum=sum.xor(new Binary(arr[i]));
6         }
7         System.out.println(sum.binary);
8
9     }

上述为我测试的代码,即只要数组含有偶数个整数,而只有一个是奇数个的整数,就能把这个奇数找出来,最后打印出来的是奇数的二进制形式,其实最后我该写的方法,把二进制转换成int的.实现应该比较简单。

  最后补充一句,其实这样做效率是很低的,要对每一个string的位操作,其中还有string+“”的语句其实很低效,我只是为了实现而实现罢了,实际还是用hashmap记录每个数出现的次数,把奇数次的拎出来就可以了,再嫌慢的话,直接用c语言哈!

时间: 2024-10-13 19:44:31

用java实现异或操作的相关文章

C++ 中的异或操作^

好好的利用异或能够产生奇妙的效果. 异或运算的性质: 不论什么一个数字异或它自己都等于0.也就是说.假设我们从头到尾依次异或数组中的每个数字,那么终于的结果刚好是那个仅仅出现一次的数字.由于那些出现两次的数字所有在异或中抵消掉了. 例题: 给定大小是N的数组,数组里的元素互相不反复,元素的大小范围是1-(N+1).目标是找出第一个miss的数.要求时间复杂度O(N).空间是O(1). 由于这个数组总共仅仅有N 个元素,因此在1--N+1中必然有一个数不存在.设res =0, 使用异或操作,先让r

用异或操作实现的交换函数用以实现数组逆置中须要注意的问题

用元素交换函数实现数组逆置非常easy,如以下代码:(数组左右元素交换) #include<iostream> #include<stdlib.h> using namespace std; void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } int main() { int a[5] = { 1, 2, 3, 4, 5 }; int lenth = sizeof(a) / sizeof(a[0]);

用异或操作实现的交换函数用以实现数组逆置中需要注意的问题

用元素交换函数实现数组逆置很简单,如下面代码:(数组左右元素交换) #include<iostream> #include<stdlib.h> using namespace std; void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } int main() { int a[5] = { 1, 2, 3, 4, 5 }; int lenth = sizeof(a) / sizeof(a[0]); in

为什么三次异或操作可以交换两个数

a和b是两个整数,经过以下三次异或操作,可以达到交换目的:a = a ^ b;b = a ^ b;a = a ^ b; 首先要理解,什么是^(异或)操作: 二进制两数运算结果: 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0相同为0,不同为1 假设: a = 10 , 其二进制数为: 1010 b = 12 , 其二进制数为: 1100如果a和b交换,在二进制数看来,因为第一位和最后一位数相同,所以中间两位数只要交换一下就行了这个交换的过程,因为二制进中只有两个数

Java随笔:使用异或操作交换变量值的风险

在面试中,经常会问到“如何不用中间变量交换两个变量值”. 看看下面这个代码输出是什么: int x = 1984; int y = 2001; x^=y^=x^=y; System.out.println("x="+x+";y="+y); 看上去应该很完美的:x=2001;y=1984 实际输出是:x=0;y=1984 问题出在哪里?是的,就是JVM的编译器. 看看实际的汇编: Code: 0: sipush 1984 3: istore_1 4: sipush 2

Java报异常时getMessage()方法返回null

有次在查看项目日志的时候发现getMessage()返回值是null,以为是代码写的有问题,后来发现空指针异常时返回值就是null,虽然问题原因找到,但是感觉在日志中单单输出null对我们查看日志不够友好,想找到一种更好的方式. 原因 翻阅了API后发现getMessage()是Throwable类提供的方法 getMessage public String getMessage() Returns the detail message string of this throwable. Ret

【java】异或&quot;^&quot;的特性

1,什么是异或 异或是一种逻辑运算符,使用符号“^”表示,异或就是在对二进制进行操作的过程中,相同的取0,不同的取1. 2,证明a==a^b^b: 关于这个结论读者肯定都知道,其中b^b的结果肯定全是0,然后任何数和0取异或都不会变.所以a==a^b^b是成立的. 3,使用异或的特性互调两个数 如果需要互调整数a和b,那么可以: int temp=a; a=b; b=temp; 也可以使用异或: a=a^b; b=a^b; a=a^b;

Java实现异或加密

/** * 异或加密 * * @param strOld * 源字符串 * @param strKey * 密钥 * @return 加密后的字符串 */ public static String encrypt(String strOld, String strKey) { byte[] data = strOld.getBytes(); byte[] keyData = strKey.getBytes(); int keyIndex = 0; for (int i = 0; i < strO

java中异或加密

static String simple_xor(String base_data, String encrypt_key) throws UnsupportedEncodingException {        StringBuffer xor = new StringBuffer("");        int base_len = base_data.length();        int encrypt_len = encrypt_key.length();