^异或

/*
 * 现在有一个整数类型的数组,
 * 数组中素只有一个元素只出现一次,
 * 其余的元素都出现两次。
 * 要求:线性复杂度,不使用额外的内存
 * [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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值