leetcode 3315. 构造最小位运算数组 II 中等

给你一个长度为 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

示例 2:

**输入:**nums = [11,13,31]

输出:[9,12,15]

解释:

  • 对于 i = 0 ,满足 ans[0] OR (ans[0] + 1) = 11 的最小 ans[0]9 ,因为 9 OR (9 + 1) = 11
  • 对于 i = 1 ,满足 ans[1] OR (ans[1] + 1) = 13 的最小 ans[1]12 ,因为 12 OR (12 + 1) = 13
  • 对于 i = 2 ,满足 ans[2] OR (ans[2] + 1) = 31 的最小 ans[2]15 ,因为 15 OR (15 + 1) = 31

提示:

  • 1 <= nums.length <= 100
  • 2 <= nums[i] <= 10^9
  • nums[i] 是一个质数。

分析:x+1 在二进制上是把 x 最低位 0 的右边所有的 1 变成 0,再把最低位的 0 变成 1,由此可得 x OR (x+1) 就是把 x 最低位的 0 变成 1,这个值一定是一个奇数。由于 nums 数组元素都是质数,当 nums[i] 为 2 时一定无解,对应的 ans[i] 等于 -1;其它奇数质数的情况时,从低位向高位找到连续的最高位的 1,把这个位置的 1 变成 0 即为答案。

举例:设 nums[i] 的二进制为 00010111,对应的答案为 00010011。算法为:遇到 0 之前,从低位向高位找到连续的最高位 1,把这一位变成 0.

cpp 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* minBitwiseArray(int* nums, int numsSize, int* returnSize) {
    int *ans=(int*)malloc(sizeof(int)*numsSize);
    *returnSize=numsSize;
    for(int i=0;i<numsSize;++i)
    {
        if(nums[i]==2)ans[i]=-1;
        else
        {
            int temp=nums[i],cnt=1;ans[i]=nums[i];
            while(temp&1)
                cnt*=2,temp>>=1;
            ans[i]-=cnt/2;
        }
    }

    return ans;
}
相关推荐
Charlie_lll27 分钟前
力扣解题-移动零
后端·算法·leetcode
iAkuya1 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
YuTaoShao6 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
TracyCoder1238 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
草履虫建模15 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
VT.馒头19 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
不穿格子的程序员1 天前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法
VT.馒头1 天前
【力扣】2722. 根据 ID 合并两个数组
javascript·算法·leetcode·职场和发展·typescript
执着2591 天前
力扣hot100 - 108、将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
52Hz1181 天前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode