位运算相关 及 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 }

 

 

其他详细可见

位运算基础知识_AlgoMooc算法慕课网

posted @ 2021-11-30 16:44  DidUStudy  阅读(49)  评论(0编辑  收藏  举报