「華為機試オンライン訓練」の削除文字列に最も出現回数の少ない文字


タイトルの説明
削除文字列の中で最も出現回数の少ない文字を実現し、複数の文字が出現回数が同じであれば、すべて削除します.これらの単語を削除した文字列を出力し、文字列内の他の文字は元の順序を維持します. 
説明を入力:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

输出描述:

删除字符串中出现次数最少的字符后的字符串。

示例1

输入

abcdd
しゅつりょく
dd
最初に私がこの問題を見たとき、第一反応はどのように26文字の出現回数を記録するかで、私がすべての文字の出現回数を記録すれば、すべての文字の出現回数をソートして、出現回数が最も少ないものを選んで、それから出力の除去であればいいので、原理は簡単です.しかし、最初は構造体を採用し、26文字を対応する回数に結びつけました.
一、第一版コード
次のようになります.
typedef struct
{
    int word;
    int num;
}stu;

    stu stu_count[27];
    for(int i=0;i<27;i++)
    {
        stu_count[i].word='a'+i;
        stu_count[i].num=0;
    }
この時自分は単純にこのような処理が便利だと思っていたが、隠れた問題点は考えられず、続けて下へ、出現したアルファベットの回数をstu[i]に記録したいと思っていた.numでは、アルファベットと下付き文字の関係をはっきり理解していないため、エラーが発生しました.この場合は実行できません.エラーコードは次のとおりです.
for(int j=0;j<27;++j)
       {
           for(unsigned int i=0;i
もしこのステップの処理が成功したら、次のステップは出現の最小回数を求めるべきではないでしょうか.私は無邪気にコードを書きます.
 
 int min = stu_count[0].num;
       cout<
これを書いたとき、私はまだ問題点を発見していなかったので、出力を書き終わりました.コードは以下の通りです.
     
 for(unsigned int i=0;imin)
                 cout<
がこの時点で実行された後、下付き文字をアルファベットに関連付けていないことに気づきました.これはすべての問題で、正しい出力は得られません.
二、そこで修正コードは以下の通りである.
アルファベットと下付き文字を結びつけるにはどうすればいいかよく考えてみましょう.それはアルファベットを数字に変換することです.このとき、文字間の減算が現れます.以下に示します.
  
for(int i=0;i<26;i++)
            a[i]=0;
        for(unsigned int i=0;i
巧みに要求を実現したのか、このときa[]配列に格納されているのは対応するアルファベットの個数であり、次に同様に最小値の解を行い、直接ループ中にIf文を用いて判断する.以下に示す.
min=a[str[0]-'a'];
        for(unsigned int i=0;i
上から最小の出現回数を抽出し、下から出力する場合はこの最小値で判断し、次のように正しい結果を出力します.
for(unsigned int i=0;imin)
                cout<
ここではcout<3を加えて、最後の完全なコードに注意してください.
      
#include 
#include 
using namespace std;


int main()
{
    string str;
    int min;
    int a[26];
    while(cin>>str)
    {
        for(int i=0;i<26;i++)
            a[i]=0;
        for(unsigned int i=0;imin)
                cout<