banner
cells

cells

为美好的世界献上 bug

2917. K-or値を配列から見つける

2917. 配列の K-or 値を見つける#

整数配列numsnumsと整数kkが与えられます。

numsnumsK-orは、次の条件を満たす非負整数です。

  • numsnumsの中に、少なくともkk個の要素が 1 の場合、K-or の i 番目のビットの値は 1 です。

numsnumsK-or値を返します。

注意: 整数xxについて、(2iANDx)==2i(2^i AND x) == 2^iの場合、xxの i 番目のビットの値は 1 です。ここで、ANDANDはビットごとの論理積演算子です。

例 1:

入力:nums = [7,12,9,8,9,15], k = 4
出力:9
説明:nums[0]、nums[2]、nums[4]、nums[5]の0番目のビットの値は1です。
nums[0]とnums[5]の1番目のビットの値は1です。
nums[0]、nums[1]、nums[5]の2番目のビットの値は1です。
nums[1]、nums[2]、nums[3]、nums[4]、nums[5]の3番目のビットの値は1です。
0番目と3番目のビットのみが、対応する位置に少なくともk個の要素が1である配列を満たします。したがって、答えは2^0 + 2^3 = 9です。

例 2:

入力:nums = [2,12,1,11,4,5], k = 6
出力:0
説明:k == 6 == nums.lengthのため、配列の6-orは、すべての要素のビットごとの論理積の結果です。したがって、答えは2 AND 12 AND 1 AND 11 AND 4 AND 5 = 0です。

例 3:

入力:nums = [10,8,5,9,11,6,8], k = 1
出力:15
説明:k == 1のため、配列の1-orは、すべての要素のビットごとの論理和の結果です。したがって、答えは10 OR 8 OR 5 OR 9 OR 11 OR 6 OR 8 = 15です。

ヒント:

  • 1<=nums.length<=501 <= nums.length <= 50
  • 0<=nums[i]<2310 <= nums[i] < 2^{31}
  • 1<=k<=nums.length1 <= k <= nums.length

ビット演算#

class Solution {
public:
    int findKOr(vector<int>& nums, int k) {
        int res = 0;
        for (int i = 0; i < 32; ++i) {
            int cnt = 0;
            for (const auto &num : nums) {
                if ((num >> i) & 1) {
                    ++cnt;
                }
            }
            if (cnt >= k) {
                res += (1 << i);
            }
        }
        return res;
    }
};
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。