leetcode 3314. 构造最小位运算数组 I 简单

给你一个长度为 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] <= 1000
  • nums[i] 是一个质数。

分析:由于数据量很小,对于每个 i,可以从小到大枚举 1,nums\[i-1] 这个区间所有的数,找到符合条件的作为答案,如果没有,则对应位置的答案为 -1.

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)
    {
        int f=0;
        for(int j=1;j<nums[i]&&!f;++j)
        {
            if((j|j+1)==nums[i])ans[i]=j,f=1;
        }
        if(!f)ans[i]=-1;
    }
    return ans;
}
相关推荐
玖玥拾11 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
Hi李耶13 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
白白白小纯17 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
zander25818 小时前
35. 搜索插入位置:从边界语义理解二分查找
数据结构·算法·leetcode
yyds_yyd_1008619 小时前
3731. 找出缺失的元素(2026.08.04)
c++·leetcode
lueluelue471 天前
LeetCode:链表
算法·leetcode·链表
橘子汽水1681 天前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
Re.不晚1 天前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
青山木1 天前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
星轨初途2 天前
LeetCode 热题 100——day2 字母异位词分组
c++·算法·leetcode