我之前文章LeetCode3226题. 使两个整数相等的位更改次数(原创)-CSDN博客对于LeetCode第3226题中给出了解法,后来思考了一下可以用位操作来完成更简洁优雅的实现:
- 首先计算n和k的异或值m.m中的所有位数中为1的值就是n中为1k中为0,或者n中为0k中为1;
- m&n的结果如果不等于m,那么说明存在n中为0k中为1的情况,那么上文分析的分析,n不可能变换成k,直接返回-1;
- 否则说明m里面所有位数为1的值都是n中为1k中为0的情况,那么直接计算返回m中位数为1的数值即可
- 计算m中位数为1的数值方法采用经典的减一循环法
按照此思路完成如下代码优化编写
public int minChanges(int n, int k) {// 计算n和k异或值m,m中的所有位数中为1的值就是n中为1k中为0,或者n中为0k中为1int m = (n ^ k);// m&n的结果如果不等于m,那么说明存在n中为0k中为1的情况,n不可能变换成k,直接返回-1if ((m & n) != m) return -1;// m里面所有位数为1的值都是n中为1k中为0的情况,那么直接计算返回m中位数为1的数值即可int count = 0;while (m != 0) {count++;m = m & (m - 1);}return count;
}
最后成功提交leetcode