力扣(leetcode)每日一题 3315 构造最小位运算数组 II | 数学技巧

ops/2024/10/18 5:47:27/
leetcode.cn/problems/construct-the-minimum-bitwise-array-ii/description/" rel="nofollow">3315. 构造最小位运算数组 II - 力扣(LeetCode)
题干

给你一个长度为 n 的

质数

数组 nums 。你的任务是返回一个长度为 n 的数组 ans ,对于每个下标 i ,以下 条件 均成立:

  • ans[i] OR (ans[i] + 1) == nums[i]

除此以外,你需要 最小化 结果数组里每一个 ans[i] 。

如果没法找到符合 条件 的 ans[i] ,那么 ans[i] = -1 。

质数 指的是一个大于 1 的自然数,且它只有 1 和自己两个因数。

示例 1:

**输入:**nums = [2,3,5,7]

输出:[-1,1,4,3]

解释:

  • 对于 i = 0 ,不存在 ans[0] 满足 ans[0] OR (ans[0] + 1) = 2 ,所以 ans[0] = -1 。
  • 对于 i = 1 ,满足 ans[1] OR (ans[1] + 1) = 3 的最小 ans[1] 为 1 ,因为 1 OR (1 + 1) = 3 。
  • 对于 i = 2 ,满足 ans[2] OR (ans[2] + 1) = 5 的最小 ans[2] 为 4 ,因为 4 OR (4 + 1) = 5 。
  • 对于 i = 3 ,满足 ans[3] OR (ans[3] + 1) = 7 的最小 ans[3] 为 3 ,因为 3 OR (3 + 1) = 7 。
题解

这里的题目没有做出来,题解是看的别人。

可以发现,x ∣ (x+1) 的本质是把二进制最右边的 0 置为 1。 —— 这个你可以感觉出来,但是则怎么证明,我也不知道,题解也没有说,就是很微妙!

100111 这个数字,最右边的0在(从右到左数)第四个,将其变成1
也就是 101111
因此,变出来的这个数字,逆推
可以有以下的可能
100111
101011
101101
101110
然后又是需要最小的数字
那么就是找这个数字,最左边的1在哪里,然后将其变成0

写法一
把 101111 取反,得 010000,其 lowbit=10000,右移一位得 1000。把 101111 与 1000 异或,即可得到 100111。

写法二

把 101111 加一,得 110000,再 AND 101111 取反后的值 010000,可以得到方法一中的 lowbit=10000。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/construct-the-minimum-bitwise-array-ii/solutions/2948584/o1-ji-suan-mei-ge-shu-pythonjavacgo-by-e-6l9l/

我找到最左边的1,就比较暴力了,用的循环。

  public static int[] minBitwiseArray(List<Integer> nums) {int[] res = new int[nums.size()];for (int i = 0; i < nums.size(); i++) {int value = nums.get(i);if (value == 2) {res[i] = -1;continue;}int count = 0;while ((1 << count & value) > 0) {count++;}count -= 1;// 需要将这一个地方的1,设置为0int newvalue = 1 << count;res[i] = newvalue ^ value;}return res;}
总结

数学技巧题目,每次见了都怕。做过一遍再说也写不出来。本身也练习不多
但是这种面试上不会考,因为不能像动态规划有区分度。


http://www.ppmy.cn/ops/126401.html

相关文章

设计模式-原型模式(克隆、Clone、Prototype)

原型模式&#xff08;克隆、Clone、Prototype&#xff09;是一种创建型设计模式&#xff0c; 使你能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类。 问题 譬如美国研制了一种特效药&#xff0c;而且还在专利保护器内&#xff0c;而印度制药公司看中了&#xff0…

C语言哈希表

哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;用于实现快速的数据查找、插入和删除操作。哈希表通过将关键字&#xff08;Key&#xff09;映射到表中的位置&#xff08;索引&#xff09;&#xff0c;实现近似常数时间的操作效率。哈希表在许多应用…

Oracle用户以及初学的经验

背景&#xff1a;目前略&#xff0c;后续补上 //创建用户 CREATE USER tpmeaccount IDENTIFIED BY 12345678; //授权权限 GRANT CONNECT, RESOURCE TO tpmeaccount;//登录&#xff0c; 以sysdba这个角色登录 &#xff0c; sys是用户名 /后面是密码 sqlplus sys/123456 as sysd…

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

文章目录 人脸关键点定位一、作用二、原理三、代码实现1. 构造人脸检测器2. 载入模型&#xff08;加载预测器&#xff09;3. 获取关键点4. 显示图像5. 完整代码 总结 人脸关键点定位 在dlib库中&#xff0c;有shape_predictor_68_face_landmarks.dat预测器&#xff0c;这是一个…

重构长方法之以方法对象取代方法

以方法对象取代方法 是重构长方法的一种技术&#xff0c;适用于那些过长、逻辑复杂且难以拆解的单一方法。此方法通过引入一个新的类&#xff0c;将原本庞杂的方法转化为一个对象方法&#xff0c;这样可以更容易将方法中的不同步骤拆解为多个私有方法&#xff0c;使代码结构清晰…

python实现屏幕录制,录音录制工具

python实现屏幕录制&#xff0c;录音录制工具 一&#xff0c;介绍 Python 实现的屏幕录制和录音录制工具是一个便捷的应用程序&#xff0c;旨在帮助用户同时捕捉计算机屏幕上的活动以及与之相关的音频输出。这个工具尤其针对教育工作者、内容创作者、技术支持人员以及任何需要…

数据库的相关概念

先看与数据库有关的几个名词&#xff1a; DB&#xff1a;database&#xff0c;数据库&#xff0c;里边保存了有组织的规范的数据。 DBMS&#xff1a;database management system &#xff0c; 数据库管理系统&#xff0c;简称数据库软件&#xff0c;数据库产品&#xff0c;数…

Python操作MySQL数据库:基础教程与示例代码

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…