链接:点名
题意
某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。
Solution
1.任何数和0进行异或运算,结果为任何数。
2.任何数和自身进行异或运算,结果为0
class Solution {
public:
int takeAttendance(vector<int>& records) {
int n = records.size();
int r = 0;
for (int i = 0; i < n; i++)
r ^= (records[i] ^ i);
return r ^ n;
}
};
链接:位1的个数
题意
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
while (n) {
n &= n - 1;
ret++;
}
return ret;
}
};
链接:检查按位或是否存在尾随零
题意
给你一个 正整数 数组 nums 。
你需要检查是否可以从数组中选出 两个或更多 元素,满足这些元素的按位或运算( OR)结果的二进制表示中 至少 存在一个尾随零。
例如,数字 5 的二进制表示是 “101”,不存在尾随零,而数字 4 的二进制表示是 “100”,存在两个尾随零。
如果可以选择两个或更多元素,其按位或运算结果存在尾随零,返回 true;否则,返回 false 。
Solution
与操作:全一为一,有零为零。即只有两个操作数都为1时,结果才为一,其他情况均为0.
根据and操作知,nums中需至少存在两个偶数。
class Solution {
public:
bool hasTrailingZeros(vector<int> &nums) {
int even = nums.size();
for (int x: nums) {
even -= x % 2;
}
return even >= 2;
}
};