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;
}
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;
}
然后就看了柳神的:
解析: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;
}