只出现一次的数字(simple难度)
https://leetcode-cn.com/problems/single-number/
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
注:本题不能使用排序+遍历,因为一旦使用排序,时间复杂度就不是线性的了。
汉明距离(simple难度)
https://leetcode-cn.com/problems/hamming-distance/
class Solution {
public int hammingDistance(int x, int y) {
return Integer.bitCount(x ^ y);
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/hamming-distance/solution/yi-ming-ju-chi-by-leetcode/
来源:力扣(LeetCode)
class Solution {
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int distance = 0;
while (xor != 0) {
if (xor % 2 == 1)
distance += 1;
xor = xor >> 1;
}
return distance;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/hamming-distance/solution/yi-ming-ju-chi-by-leetcode/
来源:力扣(LeetCode)
class Solution {
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int distance = 0;
while (xor != 0) {
distance += 1;
// remove the rightmost bit of '1'
xor = xor & (xor - 1);
}
return distance;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/hamming-distance/solution/yi-ming-ju-chi-by-leetcode/
来源:力扣(LeetCode)
比特位计数(medium难度)
https://leetcode-cn.com/problems/counting-bits/
<方法一>:布赖恩▪克尼根算法(本博文前文的关于《汉明距离》的题解中有关于布赖恩▪克尼根算法的介绍)
public class Solution {
public int[] countBits(int num) {
int[] ans = new int[num + 1];
for (int i = 0; i <= num; ++i)
ans[i] = popcount(i);
return ans;
}
private int popcount(int x) {
int count;
for (count = 0; x != 0; ++count)
x &= x - 1; //将最低有效非零位归零
return count;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/counting-bits/solution/bi-te-wei-ji-shu-by-leetcode/
来源:力扣(LeetCode)
<方法二>:动态规划 + 最高有效位
public class Solution {
public int[] countBits(int num) {
int[] ans = new int[num + 1];
int i = 0, b = 1;
// [0, b) 已经计算出来
while (b <= num) {
// 从[0, b)产生[b, 2b) 或 [b, num)
while(i < b && i + b <= num){
ans[i + b] = ans[i] + 1;
++i;
}
i = 0; // i置0
b <<= 1; // b = 2b
}
return ans;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/counting-bits/solution/bi-te-wei-ji-shu-by-leetcode/
来源:力扣(LeetCode)
<方法三>:动态规划 + 最低有效位
public class Solution {
public int[] countBits(int num) {
int[] ans = new int[num + 1];
for (int i = 1; i <= num; ++i)
ans[i] = ans[i >> 1] + (i & 1); //x >> 1表示 x / 2 , x & 1 表示 x % 2
return ans;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/counting-bits/solution/bi-te-wei-ji-shu-by-leetcode/
来源:力扣(LeetCode)
本方法另一种理解方式:
作者:duadua
链接:https://leetcode-cn.com/problems/counting-bits/solution/hen-qing-xi-de-si-lu-by-duadua/
来源:力扣(LeetCode)
<方法四>:动态规划 + 最后设置位
public class Solution {
public int[] countBits(int num) {
int[] ans = new int[num + 1];
for (int i = 1; i <= num; ++i)
ans[i] = ans[i & (i - 1)] + 1;
return ans;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/counting-bits/solution/bi-te-wei-ji-shu-by-leetcode/
来源:力扣(LeetCode)
复杂度同方法三。