^异或

it2024-08-19  46

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