C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で、他の要素がすべて2回出現する配列から1回だけ出現する要素を見つける方法

問題の概要

配列Aがあるとします。この配列には2回出現する数値がいくつか含まれていますが、1回だけ出現する数値は1つのみです。この配列から、その唯一の要素を見つけ出す必要があります。

例えば、A = [1, 1, 5, 3, 2, 5, 2] の場合、出力は 3 になります。すべての数値が2回ずつ出現しているため、XOR(排他的論理和)を使うと重複する要素を互いに打ち消すことができます。これは「y XOR y = 0」というXORの性質を利用したテクニックです。

アルゴリズムの手順

  • 変数 res = 0 を用意します

  • 配列Aの各要素 e に対して、res := res XOR e を実行します

  • 最後に res を返します

XORの重要な性質

  • x XOR x = 0(同じ値同士のXORは0になる)

  • x XOR 0 = x(0とのXORでは元の値が保たれる)

  • 交換法則・結合法則が成り立つため、処理の順序は結果に影響しない

これらの性質により、同じ数値が2回出現すると互いに打ち消し合い、最終的に残るのは1回だけ出現した要素となります。

Pythonでの実装例

class Solution(object):
    def singleNumber(self, nums):
        ans = nums[0]
        for i in range(1, len(nums)):
            ans ^= nums[i]
        return ans

ob1 = Solution()
print(ob1.singleNumber([1, 1, 5, 3, 2, 5, 2]))

C++での実装例

#include <iostream>
#include <vector>
using namespace std;

int singleNumber(vector<int>& nums) {
    int res = 0;
    for (int e : nums) {
        res ^= e;
    }
    return res;
}

int main() {
    vector<int> nums = {1, 1, 5, 3, 2, 5, 2};
    cout << singleNumber(nums) << endl;  // 出力: 3
    return 0;
}

入力

[1,1,5,3,2,5,2]

出力

3

計算量の分析

時間計算量:O(n) ― 配列を一度走査するだけで完了します。
空間計算量:O(1) ― 変数を1つ使うだけで追加メモリは不要です。

ハッシュマップなどを使う方法でも解けますが、XORを利用すれば余分なメモリを消費せずに効率的に解決できるのが大きなメリットです。

  1. C++で配列内の各要素に最も近い大きい値を効率的に検索する方法

    この記事では、配列内の各要素に対して「最も近い大きい値」を効率的に検索する方法を解説します。ある要素 x より大きい値が配列内に存在する場合、その中で最も小さい値(次に大きい要素)をその要素の答えとし、存在しない場合は -1 を出力します。例として、配列が {10, 5, 11, 10, 20, 12} の場合、結果は {11, 10, 12, 11, -1, 20} となります。最大値の 20 より大きい要素は配列内に存在しないため、20 に対しては -1 が出力されます。解決のアプローチこの問題は C++ STL の set(セット)を使うと簡単に解決できます。set は二分探索木をベース

  2. C++で配列の最大要素とその位置を見つける方法

    配列の最大要素とは配列には複数の要素が格納されており、その中で他のすべての要素よりも大きい値を持つものが「最大要素」です。具体例51724上記の配列の場合、最大要素は7であり、インデックス2の位置に存在します。それでは、配列の最大要素を求めるC++プログラムを見ていきましょう。サンプルコード#include <iostream> using namespace std; int main() { int a[] = {4, 9, 1, 3, 8}; int largest, i, pos; largest = a[0]; for(i=1; i<