/*
* 现在有一个整数类型的数组,
* 数组中素只有一个元素只出现一次,
* 其余的元素都出现两次。
* 要求:线性复杂度,不使用额外的内存
* [1,0,1]
* 对题目进行分析:1.需要每次从拿出一个数字,跟原数组进行比较,但是需要用到循环嵌套,时间复杂度为o(n^2),不符合题目要求 。
* 在经过长时间的思考之后,我发现,对不起我是逗逼,然后仔细观看了打神们的解题思路(我现在还是很菜的emmmm)
* 因为需要线性复杂度(理解为o(n))
* 所以需要借用^ :异或运算符,相同为0,不同为1。
* 例如 1^2 =
* 1 0000 0001
* 2 0000 0010
* 结果:0000 0011 = 3
* 3^2 =
* 3 0000 0011
* 2 0000 0010
* 结果:0000 0001 = 1
* 通过上述过程可以得出,在一个数列中,比如【1,2,3,4,5,6,5,4,3,2,1】,在经过异或之后,1^2^3^4^5^6^5^4^3^2^1 = 6,get到一个新节能功能,^运算符可以消除掉一个数组中的重复数字。如下:
*
* */
public class Demo{
public static void main(String[] args){
int[] array = {1,0,1};
Demo demo = new Demo();
System.out.print(demo.getSingleNum(array));
}
public int getSingleNum(int[] array){
int num = 0;//为什么要用0呢?
/* 因为0和任何数异或都为任何数,别说我我忘记了负数,负数也是一样的。不同的是负数在计算机中用补码进行存储,补码的转换自己来吧,嘿嘿~~
*/
for(int i = 0 ; i < array.length ; i++){
num ^= array[i];
}
return num;
}
}
但是又有一个新的问题,假如为字符嘞,于是又开始新的征程。先来个小小的测试案例:
public class Test {
static int count = 0;
public static void main(String[] args) {
System.out.println('a'^'b');
}
}
输出结果为:3
在计算机底层对字符进行^操作运算,会自动转换成ASCII值进行运算a 值97 b为98
a 0110 0001
b 0110 0010
结果: 0000 0011 为 3