当前位置: 首页 > news >正文

LeetCode 2997.使数组异或和等于K的最少操作次数

给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。

你可以对数组执行以下操作 任意次 :

选择数组里的 任意 一个元素,并将它的 二进制 表示 翻转 一个数位,翻转数位表示将 0 变成 1 或者将 1 变成 0 。
你的目标是让数组里 所有 元素的按位异或和得到 k ,请你返回达成这一目标的 最少 操作次数。

注意,你也可以将一个数的前导 0 翻转。比方说,数字 (101)2 翻转第四个数位,得到 (1101)2 。

示例 1:

输入:nums = [2,1,3,4], k = 1
输出:2
解释:我们可以执行以下操作:

  • 选择下标为 2 的元素,也就是 3 == (011)2 ,我们翻转第一个数位得到 (010)2 == 2 。数组变为 [2,1,2,4] 。
  • 选择下标为 0 的元素,也就是 2 == (010)2 ,我们翻转第三个数位得到 (110)2 == 6 。数组变为 [6,1,2,4] 。
    最终数组的所有元素异或和为 (6 XOR 1 XOR 2 XOR 4) == 1 == k 。
    无法用少于 2 次操作得到异或和等于 k 。
    示例 2:

输入:nums = [2,0,2,0], k = 0
输出:0
解释:数组所有元素的异或和为 (2 XOR 0 XOR 2 XOR 0) == 0 == k 。所以不需要进行任何操作。

提示:

1 <= nums.length <= 105
0 <= nums[i] <= 106
0 <= k <= 106

先求出数组中所有数字的异或和,然后看看与k差几位即可:

class Solution {
public:int minOperations(vector<int>& nums, int k) {int xorRes = 0;for (int num : nums){xorRes ^= num;}int diff = xorRes ^ k;int ans = 0;while (diff){++ans;diff = diff & (diff - 1);}return ans;}
};

如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。

http://www.lryc.cn/news/306776.html

相关文章:

  • 计算机设计大赛 深度学习大数据物流平台 python
  • WPF 附加属性+控件模板,完成自定义控件。建议观看HandyControl源码
  • 编程笔记 Golang基础 040 defer、panic 和 recover
  • 通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存
  • ARM 版银河麒麟桌面系统下 Qt 开发环境搭建指南
  • 架构面试题汇总:缓存(二)
  • 【docker入门】1-
  • 微信小程序-全局配置
  • 【Android】性能优化之内存、网络、布局、卡顿、安装包、启动速度优化
  • 第3.6章:StarRocks数据导入——DataX StarRocksWriter
  • 【非递归版】归并排序算法(2)
  • [C++]C++实现本地TCP通讯的示例代码
  • Sora - 探索AI视频模型的无限可能
  • 【JavaScript 漫游】【022】事件模型
  • 【加密算法】RSA非对称加密算法简介
  • 深入理解 JavaScript 对象原型,解密原型链之谜(上)
  • 产品经理学习-产品运营《什么是SOP》
  • 大数据Hadoop生态圈
  • 算法简介:查找与算法运行时间
  • 零基础C++开发上位机--基于QT5.15的串口助手(三)
  • Facebook的虚拟社交愿景:元宇宙时代的新起点
  • 【深度学习笔记】4_6 模型的GPU计算
  • 留学申请过程中如何合理使用AI?大学招生官怎么看?
  • vue2与vue3的diff算法有什么区别
  • ES小总结
  • vue2与vue3中父子组件传参的区别
  • 使用vuetify实现全局v-alert消息通知
  • CentOS 7.9上编译wireshark 3.6
  • 初学学习408之数据结构--数据结构基本概念
  • Java项目中必须使用本地缓存的几种情况