2026-01-20-LeetCode刷题笔记-3314-构造最小位运算数组I


title: 2026-01-20-LeetCode刷题笔记-3314-构造最小位运算数组I

date: 2026-01-20

tags:

  • 算法学习
  • LeetCode
  • 位运算

题目信息


题目描述

给定一个整数数组 nums(题面为素数数组),对每个 nums[i] 寻找最小的非负整数 x,使得 x | (x + 1) == nums[i]。若不存在这样的 x,返回 -1。


初步思路

  1. 观察 x | (x + 1):它会把 x 的"最右侧第一个 0"变成 1,因此结果必然以连续的 1 结尾。
  2. 若 y = nums[i],设 y 末尾连续 1 的个数为 k,则最小的 x 就是把这段连续 1 中最高位的那个 1 清掉。
  3. 题面为素数数组,因此只有 y=2 为偶数且无解,其他 y 都是奇数可处理。

算法分析

  • 核心:统计 y 的末尾连续 1 的个数 k,然后 x = y - (1 << (k - 1))
  • 技巧:x | (x + 1) 的结果一定是奇数且以连续 1 结尾
  • 时间复杂度:O(n * k),k 为末尾连续 1 的数量(总体很小)
  • 空间复杂度:O(1)(不含输出)

代码实现(Python)

解法一:统计末尾连续 1

python 复制代码
from typing import List

class Solution:
    def minBitwiseArray(self, nums: List[int]) -> List[int]:
        ans = []
        for num in nums:
            if num == 2:
                ans.append(-1)
                continue
            k = 0
            while num & (1 << k):
                k += 1
            ans.append(num - (1 << (k - 1)))
        return ans

解法二:位运算快速定位翻转位

python 复制代码
from typing import List

class Solution:
    def minBitwiseArray(self, nums: List[int]) -> List[int]:
        ans = []
        for num in nums:
            if num == 2:
                ans.append(-1)
                continue
            t = num ^ (num + 1)
            bit = (t + 1) >> 2
            ans.append(num ^ bit)
        return ans

总结与反思

  1. 关键在于"最右侧第一个 0 会被置 1",因此结果以连续 1 结尾。
  2. 可以用位运算快速定位要翻转的那一位
相关推荐
один but you1 分钟前
unorder_map 和unorder_set
算法·哈希算法·散列表
穗余13 分钟前
2026 AI x Web3 School共学营笔记-Day1
人工智能·笔记·web3
sheeta199814 分钟前
LeetCode 每日一题笔记 日期:2026.05.20 题目:2657. 找到前缀公共数组
笔记·算法·leetcode
数智工坊30 分钟前
【UniT论文阅读】:用统一物理语言打通人类与人形机器人的知识壁垒
论文阅读·人工智能·深度学习·算法·机器人
ABAP 成31 分钟前
删除+新增原始BOM工序+订单BOM+工序笔记
笔记
梓䈑33 分钟前
【算法题攻略】模拟
c++·算法
Evand J35 分钟前
【课题推荐与代码介绍】卡尔曼滤波器正反向估计算法原理与MATLAB实现
开发语言·算法·matlab
XS03010637 分钟前
MyBatis基础实战笔记一
笔记·mybatis
DFT计算杂谈39 分钟前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
Oll Correct44 分钟前
实验二十五:从IPv4向IPv6过渡所使用的隧道技术
网络·笔记