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

C++で文字列から重複しない年の総数を求める方法

このチュートリアルでは、文字列に含まれる重複しない年(ユニークな年)の総数を求めるC++プログラムについて解説します。

ここでは、「DD-MM-YYYY」形式の日付を含む文字列が与えられるものとします。私たちのタスクは、その文字列の中に出現する異なる年(重複を除いた年)の個数を数えることです。

実装例

#include <bits/stdc++.h>
using namespace std;
// 文字列内に含まれる重複しない年を計算する
int calculateDifferentYears(string str) {
    unordered_set<string> differentYears;
    string str2 = "";
    for (int i = 0; i < str.length(); i++) {
        if (isdigit(str[i])) {
            str2.push_back(str[i]);
        }
        if (str[i] == '-') {
            str2.clear();
        }
        if (str2.length() == 4) {
            differentYears.insert(str2);
            str2.clear();
        }
    }
    return differentYears.size();
}
int main() {
    string sentence = "I was born on 22-12-1955."
    "My sister was born on 34-06-2003 and my mother on 23-03-1940.";
    cout << calculateDifferentYears(sentence);
    return 0;
}

出力

3

コードの解説

このプログラムの動作は以下の手順で理解できます。

まず、重複を自動的に排除してくれる unordered_set(ハッシュセット)を用意します。これにより、同じ年が何度出現してもセットには1回しか登録されません。

次に、文字列を先頭から1文字ずつ走査します。

  • 数字であれば、一時バッファ(str2)に追加していきます。
  • ハイフン「-」に到達した時点でバッファをクリアします。「DD-MM-YYYY」形式では年は2つ目のハイフンの後に続くため、日や月の部分は破棄されます。
  • バッファが4桁になった時点で、それを年としてセットに挿入し、バッファを再び空にします。

最後に、セットのサイズ(size())を返すことで、文字列中に存在する重複しない年の総数が得られます。

上記のサンプルでは「1955」「2003」「1940」という3つの異なる年が含まれているため、出力は 3 となります。

  1. C++で特殊数の合計桁数を効率的に求める方法

    問題概要整数 k が与えられます。すべての桁が同じ数字で構成されている数を「特殊数(スペシャルナンバー)」と呼びます。例えば、1、11、111、1111 などが特殊数に該当します。特殊数は 1, 11, 111, 1111, 2, 22, 222, 2222, 3, 33, 333, 3333, … という順序で数え上げます。このとき、k までに現れるすべての特殊数に含まれる桁数の合計を求めるのが課題です。なお、k の値は 10000 以下であるものとします。例えば、入力が k = 9999 の場合、出力は 90 になります。解き方のアプローチこの問題を解くためには、次の手順に従います。k を

  2. C++で文字列の部分文字列の総数を求める方法を解説

    この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文