文字列の出現回数に応じてソートされたいくつかの問題の解決策

3種類の質問

1.文字列を入力し、文字数で並べ替えます。同じ場合は文字順に出力します。
例1:
入力:bbaaacddtf
出力:ctfbda
例2:
入力:acddtadtabdc
出力:bctad
思考:
最初にすべての文字を作成します-「a」を数字にして新しい配列cに格納します。その後、同じものがこの新しい配列になります。配列の同じ位置が表示され、追加後に対応する出現回数を取得できます。たとえば、aaaaccdはa [0] = 4、a [2] = 2、a [3] = 1に対応し、最大で26個しかありません。これらの26をループとして使用して、毎回最小のゼロ以外の値を見つけます。つまり、これはループの第1レベルであり、ループの第2レベルは、最小の数から始めて1つずつ比較することです(最小の数を見つける関数を自分で作成する必要があります)。最小の数に等しい値が見つかった場合は、サイクル数+ 'a'の対応する値が文字になり、新しい文字配列に割り当てられます。同時に、次回最小にならないように回数を0に変更し、最後に結果を出力できます。
ソースコード:

#include<stdio.h>
#include<string.h>
int fn(int s[27]){
    
    
   int min = 100;
   for(int j = 0; j <26; j++){
    
    
   if(s[j] < min && s[j] != 0)
   min = s[j];
}
   return min;
}
main(){
    
    
   char a[99];
   char e[99];
   int c[99]={
    
    0};
   int i, j, n, k=0, m, z=0;
   char b, fu, min;
   gets(a);
   n = strlen(a);
   for(i = 0; i < n; i++)
   c[a[i]-'a']++;
   for(i = 0; i < 26; i++){
    
    
   min = fn(c);
   for(j = 0; j<26; j++){
    
    
   if(c[j] == min){
    
    
   e[k++] = j + 'a';
   c[j] = 0;
}
}
}
   puts(e);
}


2.2番目の文字列は変更されません。各文字列は何度でも出力できます。途中にwhileループを追加します。また、最後にb [i] = '\ 0';を追加すると文字列の最後になります。(最初のものに基づいて変更します)



for( i = 0 ; i < 26; i++){
    
    

   min = fn(c);

   for( j = 0; j < 26; j++){
    
    

   if(c[j] == min){
    
    

while(c[j] != 0){
    
    

        e[k++]=j+'a';

        c[j]--;

        }

}

}

}

 e[k]='\0';

   puts(e);

3.出現回数が同じで、字句的にソートされていない場合、入力順にソートされます。

思考:
字句順に配置されていない、つまり「a」に数字を追加して保存することはできません。数日間考えた後、理解できませんでした。クラスメートに質問した後、何度もデバッグした後、構造は統計と並べ替えに使用されます。この問題を解決しました。

主なコアアイデアは、構造を介して2つのデータをバンドルすることです。残りは以前と同じであり、最小値を比較するときに0の出現を忘れることはできません。

#include<stdio.h>
#include<string.h>
struct a{
    
    
 char ch;
 int number=0;
}s[27];
int fn(a s[27])
{
    
    
   int min = 100;
   for(int j = 0; j < 26; j++)
   {
    
    
   if(s[j].number < min && s[j].number!=0)
   min = s[j].number;
}
   return min;
}
main()
{
    
    
   char a[99];
   char e[99];
   int c[99]={
    
    0};
   int i,j,n,k=0,z=0;
   char b,fu,min;
   gets(a);
   n=strlen(a);
   for(i = 0; i<n; i++){
    
    
    s[i].ch = a[i];
   }
   for(i = 0;a[i]!='\0'; i++){
    
    
   for(j = 0; j <= i; j++){
    
        
    if(a[i]==s[j].ch){
    
    
     s[j].number++;
  break;    //使用break保证全部数据都存到出现的第一个number中 第一个不断加来记录总数。
    } 
    }  
   }
    for(i=0;i<n;i++)
{
    
    
     min = fn(s);
   for(j=0;j<n;j++)
{
    
    
   if(s[j].number==min)
{
    
    
   e[k++]=s[j].ch;
   s[j].number=0;
}
}
} 
puts(e);
}

まとめ:3番目の質問は長い間何も考えずに書かれていました。クラスメートの助けを借りてコードを実装しました。より多くの練習が必要であり、構造を並べ替える方法もより多くの練習が必要です。

おすすめ

転載: blog.csdn.net/m0_46110288/article/details/106029427