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

C++で指定した範囲内の「各桁がすべて異なる」整数を検索する方法

この記事では、2つの整数 lr が与えられたとき、その範囲(両端を含む)に存在する「各桁の数字がすべて異なる」整数 x を見つけるC++のプログラムを紹介します。

例えば、入力が l = 211r = 230 の場合、出力は 213 となります。211は「1」が重複しているため条件を満たしませんが、213は各桁(2・1・3)がすべて異なるため有効な答えです。

解法のアプローチ

この問題は、以下の手順で解くことができます。

  1. l から r までの各整数 k を順番に調べます。
  2. k を文字列に変換します。
  3. 文字列の各文字(桁)をセット(set)に挿入します。セットは重複を許さないため、同じ数字は自動的に1つにまとめられます。
  4. セットのサイズと元の文字列の長さが一致していれば、すべての桁が異なることを意味するため、その数値を答えとして返します。
  5. 範囲全体を調べて該当する数値が見つからなかった場合は、「-1」を返します。

アルゴリズムの擬似コード

for initialize k := l, when k <= r, update (increase k by 1), do:
    h := convert k to string
    Define one set s
    for initialize i := 0, when i < size of h, update (increase i by 1), do:
        insert h[i] into s
    if size of s is same as size of h, then:
        return h
return "-1"

C++での実装例

実際のC++コードは以下の通りです。

#include <bits/stdc++.h>
using namespace std;

string solve(int l, int r) {
    for (int k = l; k <= r; k++) {
        string h = to_string(k);
        set<char> s;
        for (int i = 0; i < h.size(); i++)
            s.insert(h[i]);
        if (s.size() == h.size()) {
            return h;
        }
    }
    return "-1";
}
int main() {
    int l = 211;
    int r = 230;
    cout << solve(l, r) << endl;
}

実行結果

入力

211, 230

出力

213

計算量について

このアルゴリズムの時間計算量は O((r − l + 1) × d) です。ここで d は数値の桁数(最大でも10程度)を表します。検索範囲が広すぎない場合には十分に高速に動作しますが、範囲が非常に大きい場合はより効率的な手法を検討する必要があります。


  1. 【C++】数値の桁の合計が1桁になるまで計算するプログラムの作成方法

    はじめに本記事では、数値の各桁の合計を計算し、その結果が1桁になるまで処理を繰り返すC++プログラムについて解説します。例として、数値14520を考えてみましょう。まず各桁を足すと、1 + 4 + 5 + 2 + 0 = 12となります。しかし12はまだ2桁の数値なので、さらにその桁同士を足し合わせます。すると、1 + 2 = 3となります。3は1桁の数値であるため、これ以上桁の合計を計算することはできません。したがって、3が最終的な答えとなります。解法のアプローチ:デジタルルートの活用この問題を効率的に解くには、「9の倍数の各桁の合計は必ず9になる」という数学的な性質を利用します。9で割り切

  2. C++で文字列の順列の総数を求めるプログラムの作成方法

    文字列に含まれる文字は、さまざまな順序で並べ替えることができます。本記事では、与えられた文字列から作成できる順列の数を求める方法を解説します。たとえば「abc」という3文字の文字列の場合、並べ方は 3! = 6 通りあります。つまり、n 文字の文字列であれば、最大で n! 通りの並べ方が存在します。しかし、「aab」のように同じ文字が複数回含まれている場合、単純に 6 通りにはなりません。「aab」の全パターンを書き出してみると、次のようになります。abaaabbaabaaaababaこのうち、(1番目と6番目)、(2番目と5番目)、(3番目と4番目) のペアはそれぞれ同一の並び方です。したが