位运算相关 及 268. 丢失的数字
位运算
位运算即 先将数字 转化为 二进制下的表示,再进行逻辑操作,具体运算有
按位与 &
按位或 |
按位异或 ^
按位取反 ~
左移<<
右移>>>>:带符号右移。正数右移高位补0,负数右移高位补1。
>>>:无符号右移。无论是正数还是负数,高位通通补0。
<<< 与<< 之间的区别也是如此
268. 丢失的数字
描述
给定一个包含 [0, n]
中 n
个数的数组 nums
,找出 [0, n]
这个范围内没有出现在数组中的那个数。
链接
268. 丢失的数字 - 力扣(LeetCode) (leetcode-cn.com)
解法:二进制,
具体而言就是
1、 相同数字的异或为 0 A^A=0
2、 任何数字和0异或都是它自己本身 A^0 = A
从而从 0~n之间进行 ^ 异或操作,缺失的数字 只能 和 0 进行异或,从而 得到的是 本身
1 // 登录 AlgoMooc 官网获取更多算法图解 2 // https://www.algomooc.com 3 // 作者:程序员吴师兄 4 class Solution { 5 public int missingNumber(int[] nums) { 6 7 // 定义变量 missing 为零 8 int missing = 0; 9 10 // 循环遍历 nums 中的每个数字 11 for(int i = 0 ; i < nums.length; i++){ 12 13 // 将 nums 中的数字和 1 到 n 这这些数字全部进行异或 14 // 由于两个相同的数字进行异或的结果是 0 15 // 比如 5 ^ 5 = 0 16 // 又由于任何一个数和 0 进行异或还是它本身 17 // 比如 3 ^ 0 = 3 18 // 并且,题目中说明 nums 中的所有数字都独一无二 19 // 所以,最终 missing 就是那个只出现过一次的数字 20 missing ^= nums[i] ^ (i + 1); 21 System.out.println("nums : " + nums[i] + " , " + "missing: " + missing); 22 } 23 24 // missing 就是那个丢失的数字,返回就行 25 return missing; 26 } 27 }
其他详细可见