class Solution {
public:
int minChanges(int n, int k) {
unsigned int v = n ^ k;
int res = std::popcount(v);
return n < (v | n) ? -1 : res;
}
};
根据题意要将两个数使用位反转使其相等, 那么要做的就是统计不相等的位有几位, 很容易就能想到使用异或操作实现
使用cpp20
提供的std::popcount
函数就能得到结果
但是题目是只能将n的1变为0, 就是说如果出现1101
和0110
这种情况需要返回-1, 那么怎么快速检查呢?
通过思考, 转换成功的条件就是n的0位对应的k的位是不能出现1的, 所以如果两个数经过或运算那么这个新的数一定是小于等于n的那么只要n < (v | n)
就返回-1就行
其实一行都能写完return n < (v | n) ? -1 : std::popcount(n ^ k)