当前位置: 首页> 汽车> 时评 > 国家军事新闻头条_深圳网站seo优化_重庆网站快速排名优化_淘宝代运营

国家军事新闻头条_深圳网站seo优化_重庆网站快速排名优化_淘宝代运营

时间:2025/8/1 12:46:43来源:https://blog.csdn.net/niulinbiao/article/details/143456551 浏览次数: 0次
国家军事新闻头条_深圳网站seo优化_重庆网站快速排名优化_淘宝代运营

一、题目描述

给你两个正整数 n 和 k。

你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。

返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。

示例 1:

输入: n = 13, k = 4

输出: 2

解释:
最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2,

我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k。

示例 2:

输入: n = 21, k = 21

输出: 0

解释:
n 和 k 已经相等,因此不需要更改。

示例 3:

输入: n = 14, k = 13

输出: -1

解释:
无法使 n 等于 k。

提示:

1 <= n, k <= 106

二、解题思路

从集合的角度理解,k 必须是 n 的子集。如果不是,返回 −1。怎么用位运算判断,见上面的文章链接。

如果 k 是 n 的子集,答案为从 n 中去掉 k 后的集合大小,即 n⊕k 的二进制中的 1 的个数。

我们需要将整数 n 的二进制表示变成 k,并且只能将 n 中的 1 改为 0。
如果 k 的二进制表示中有比 n 中的 1 位置多的 1,则无法实现,将返回 -1。
否则,统计 n 和 k 中 1 的不同位置,计算最少的更改次数。
步骤:
使用按位与(&)和按位异或(^)来判断 n 和 k 的差异。
遍历 n 和 k 的二进制位,统计需要从 1 改为 0 的次数。
如果 k 的某一位是 1,而 n 的对应位是 0,则返回 -1,因为无法实现该转换。

三、代码

class Solution {
public:int minChanges(int n, int k) {int ret = 0;for (;n || k; n >>= 1, k >>= 1){if (n % 2 && !(k % 2)){ret++;}else if (!(n % 2) && k % 2){return -1;}}return ret;}
};
关键字:国家军事新闻头条_深圳网站seo优化_重庆网站快速排名优化_淘宝代运营

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: