PAT 1108 String复读机 知识点:哈希

83 阅读2分钟

1108 String复读机 - PAT (Basic Level) Practice (中文) (pintia.cn)

刚开始我是这样写的,遍历输入的字符串,然后每个字符映射到map里面,然后输出

但是不知道怎么让它按照“String”的顺序输出,并且只输出了一轮:

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

int main()
{
//每输出一个就减少一个字符  //统计一下字符串中String  每个字符出现的顺序,然后按照string的顺序输出,没输出
  string s;cin>>s;

    map<char,int>m;
    for(int i=0;i<s.size();i++)
    {
        m[s[i]]++;
    }

    for(auto& it:m)
    {
        if(it.first=='S'&&it.second!=0)
        {
           cout<<it.first;
            it.second--;
        }
        if(it.first=='t'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
        if(it.first=='t'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
        if(it.first=='t'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
        if(it.first=='r'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
        if(it.first=='i'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
        if(it.first=='n'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
        if(it.first=='g'&&it.second!=0)
        {
            cout<<it.first;
            it.second--;
        }
    }
    return 0;
}

image.png




Debug:

我们可以用把"String"按'S''t''r''i''n''g'的顺序存入哈希表,再将哈希表按顺序输出即可:

#include<bits/stdc++.h>
using namespace std;
int haxi[128];
int main()
{
   string s;cin>>s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='S')haxi[0]++;
        else if(s[i]=='t')haxi[1]++;
        else if(s[i]=='r')haxi[2]++;
        else if(s[i]=='i')haxi[3]++;
        else if(s[i]=='n')haxi[4]++;
        else if(s[i]=='g')haxi[5]++;
    }

    //按哈希表的顺序输出
  while(haxi[0]||haxi[1]||haxi[2]||haxi[3]||haxi[4]||haxi[5])
  {
      if(haxi[0])
      {
          cout<<'S';
          haxi[0]--;
      }
    if(haxi[1])
      {
          cout<<'t';
          haxi[1]--;
      }
    if(haxi[2])
      {
          cout<<'r';
          haxi[2]--;
      }
    if(haxi[3])
      {
          cout<<'i';
          haxi[3]--;
      }
    if(haxi[4])
      {
          cout<<'n';
          haxi[4]--;
      }
    if(haxi[5])
      {
          cout<<'g';
          haxi[5]--;
      }
  }
    return 0;
}

image.png

然后就看了柳神的:

解析:1108 String复读机 – PAT乙级真题 – 柳婼 の blog (liuchuo.net)

柳神的刚好相反,不是重复遍历输入的2字符,而是重复遍历:"String"

如果"String"出现在哈希表里面,那么就用一个六位字符的for循环重复遍历"String"的每一位进行输出,直到输出完为止。然后我们让flag保持为1,继续进入下一轮,直到哈希表里找不到“String”为止,此时flag为0,不会再遍历"String"

#include<iostream>
#include<string>
using namespace std;
string s1="String",in;
int flag=1;
int a[128];
int main()
{
    cin>>in;
    for(int i=0;i<in.size();i++)
    {
        a[in[i]]++;
    }

    while(flag)  //多轮处理逻辑
    {
        //一轮处理逻辑
        flag=0;  
        for(int i=0;i<6;i++)  //一共输出String 6个字符
        {
           if(a[s1[i]]) //如果哪个字符还有就接着输出
           {
               cout<<s1[i]; 
               a[s1[i]]--;
               flag=1;
           }
           
        }
    }

    return 0;
}

image.png