刷题记录|目标101题--位运算
写在前面
开个贴记录一下 刷题的过程,目前参照 leetcode101,目标101题,由于太久没写java了,也会涉及到一些java的基础用法,希望能和大家共勉吧~
已刷链接:
- 贪心算法:https://www.nowcoder.com/discuss/1051877
- 双指针:https://www.nowcoder.com/discuss/1057237
- 二分查找:https://www.nowcoder.com/discuss/1059986
- 排序:https://www.nowcoder.com/discuss/1063581
- 搜索:https://www.nowcoder.com/discuss/1069407
- 动态规划:https://www.nowcoder.com/discuss/1071676
- 分治法:https://www.nowcoder.com/discuss/1091335
- 链表:https://www.nowcoder.com/discuss/post/419235544456052736
- 树:https://www.nowcoder.com/discuss/post/424955068647997440
位运算原理
- ^ 异或 0^0 = 0,1^0 = 1,0^1 = 1, 1^1 = 0(同为0,异为1)
- | 按位或
- & 按位与
- ~ 按位取反
- >> 右移一位,表示/2
- << 左移一位,表示*2
No.1 Hamming Distance
链接:https://leetcode.com/problems/hamming-distance/
解题思路:
class Solution { public int hammingDistance(int x, int y) { int res = x^y; int ans = 0; while (res != 0) { ans += res & 1; res = res >> 1; } return ans; } }
No.2 Maximum Product of Word Lengths
题目:https://leetcode.com/problems/maximum-product-of-word-lengths/
解题思路:
把一个string转为一个用位表示字母是否出现的数字,则string的array变成了int的array。
注意:string 转为 int 使用的是 mask |= 1 << ((char*)c-'a'),即将1 左移(c-'a')表示位数
这个array遍历两两位与,0的即为没有重复数字
class Solution { public int maxProduct(String[] words) { int len = words.length; int[] mask = new int[len]; int ans = 0; for (int i = 0; i < words.length; i++) { for (int j = 0; j < words[i].length(); j++) { char c = words[i].charAt(j); mask[i] |= 1 << (c - 'a'); } } for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j ++) { if ((mask[i] & mask[j]) == 0) { ans = Math.max(ans,words[i].length() * words[j].length()); } } } return ans; } }
No.3 Counting Bits
题目链接:https://leetcode.com/problems/counting-bits/
解题思路:
class Solution { public int[] countBits(int n) { int[] ans = new int[n + 1]; for (int i = 0; i < n + 1; i++) { ans[i] = (i & 1) == 1 ? ans[i - 1] + 1 : ans[i>>1]; } return ans; } }
No.4 Single Number
题目链接:https://leetcode.com/problems/single-number/
解题思路:
class Solution { public int singleNumber(int[] nums) { int ans = 0; for (int num : nums) { ans ^= num; } return ans; } }