传送门 | 难度 |
---|---|
191. 位1的个数 | 简单 |
461. 汉明距离 | 简单 |
136. 只出现一次的数字 | 简单 |
逻辑运算符
与
在java中,与
运算符为&
,其运算规则如下。
0 & 0 | 0 & 1 | 1 & 0 | 1 & 1 |
---|---|---|---|
0 | 0 | 0 | 1 |
即全1为1,否则为0
或
在java中,与
运算符为|
,其运算规则如下。
0 或 0 | 0 或 1 | 1 或 0 | 1 或 1 |
---|---|---|---|
0 | 1 | 1 | 1 |
即有1为1,否则为0
异或
在java中,异或
运算符为^
,其运算规则如下。
0 ^ 0 | 0 ^ 1 | 1 ^ 0 | 1 ^ 1 |
---|---|---|---|
0 | 1 | 1 | 0 |
即相同为0,不同为1。
撸码时间
1、191. 位1的个数
题目描述:
编写一个函数,输入是一个整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例:
输入:11
输出:3
解释:输入的11的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
输入:128
输出:1
解释:输入的128的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
解法:与运算
思路:由于int型是32位,每次将n与1进行与运算,结果为1则count++,然后将n右移1位继续。
public int hammingWeight(int n) {
int count = 0;
for (int i = 0; i < 32; i++) {
if ((n & 1) == 1) {
count++;
}
n = n >> 1;
}
return count;
}
2、461. 汉明距离
题目描述:
两个整数之间的汉明距离
指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x
和 y
,计算并返回它们之间的汉明距离。
解法1:与
思路:分别x和y的二进制位,不同则count++
public int hammingDistance(int x, int y) {
int count = 0;
for (int i = 0; i < 32; i++) {
if ((x&1)!=(y&1)){
count++;
}
x = x>>1;
y = y>>1;
}
return count;
}
解法2:异或
思路:由于汉明距离对应二进制位不同的数目,而异或正好是不同为1,将x和y异或之后,就变相等于191.位1的个数
这一题。
public int hammingDistance(int x, int y) {
int count = 0;
int z = x^y;
for (int i = 0; i < 32; i++) {
if ((z&1)==1){
count++;
}
z = z>>1;
}
return count;
}
3、136. 只出现一次的数字
题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
解法
本来有挺多方法去解的,数组、map等等,但是看到说明后,突然懵了…
思路:
这是一个非常巧妙的解法,利用异或的思想,两个相同的数异或为0,0异或任何一个数等于它本身,并且异或满足交换律。即a^b^a = a^a^b = b
。而本题正好每个元素都出现两次,只有一个元素出现了一次,那么遍历数组,异或最终结果就是只出现一次的那个数。
public int singleNumber(int[] nums) {
int num = nums[0];
for (int i = 1; i < nums.length; i++) {
num = num^nums[i];
}
return num;
}