cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int cnt[30];
char s[N];
void solve()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int q=0;
for(int i=0;i<n;i++)
{
if(a[i]==0)
{
s[i]='a'+q;
q++;
cnt[s[i]-'a']++;
}
else
{
for(int j=0;j<26;j++)
if(cnt[j]==a[i])
{
s[i]=j+'a';
break;
}
cnt[s[i]-'a']++;
}
}
for(int i=0;i<n;i++)
cout<<s[i];
cout<<endl;
memset(cnt,0,sizeof cnt);
memset(s,0,sizeof s);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
赛时错了一次,自己能写出来纯属运气,不知道咋处理其实
感觉还是比较复杂,输入的是出现次数,这里的出现次数指的是,该下标左边该字母的出现次数
答案不唯一,从 a 开始计算就好了
下面贴一下我之前的错误代码
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int cnt[30];
char s[N];
void solve()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
if(a[i]==0)
{
s[i]='a'+a[i]+i;
cnt[s[i]-'a']++;
}
else
{
for(int j=0;j<26;j++)
if(cnt[j]==a[i])
{
s[i]=j+'a';
break;
}
cnt[s[i]-'a']++;
}
}
for(int i=0;i<n;i++)
cout<<s[i];
cout<<endl;
memset(cnt,0,sizeof cnt);
memset(s,0,sizeof s);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
这个代码错是因为跳过了一个字母,可能就无法表示全所有的情况
还是来说正确代码的思路,a 数组输入的是出现次数,cnt 数组表示的是该字母的出现次数,出现次数相等的时候
看了一下题解,找到了一个比较优雅的做法
cpp
#include<bits/stdc++.h>
using namespace std;
//const int N=2e5+10;
//int a[N];
//int cnt[26];
//void solve()
//{
// int n;
// cin>>n;
//
// for(int i=0;i<26;i++)
// cnt[i]=0;
//
// string ans;
//
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<26;j++)
// if(cnt[j]==a[i])
// {
// ans.append(1,'a'+j);
// cnt[j]++;
// break;
// }
// }
//
// cout<<ans<<endl;
//}
//void solve() {
// int n,x;cin>>n;
// int cnt[26] = {0};
// string ans;
// for(int i = 1;i<=n;i++)
// {
// cin>>x;
// for(int j = 0;j<26;j++)
// {
// if(cnt[j]==x)
// {
// ans.append(1,j+'a');
// cnt[j]++;
// break;
// }
// }
// }
// cout<<ans<<'\n';
//}
//void solve()
//{
// int n;
// cin>>n;
//
// int cnt[26]={0};
//
// string ans;
//
// for(int i=0;i<n;i++)
// {
// int x;
// cin>>x;
//
// for(int j=0;j<26;j++)
// {
// if(cnt[j]==x)
// {
// ans.append(1,'a'+j);
// cnt[j]++;
// break;
// }
// }
// }
//
// cout<<ans<<endl;
//}
void solve()
{
int n;
cin>>n;
int cnt[26]={0};
string ans;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
for(int j=0;j<26;j++)
if(cnt[j]==x)
{
ans.append(1,'a'+j);
cnt[j]++;
break;
}
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
其实就只有一个条件判断就行了
就是字母的出现次数和输入的元素刚好相等,然后把字符串读入,更新字母出现次数,跳出循环,append 函数是添加字符到字符串后面,第一个参数表示添加的字符个数
应该还是比较常规的题,更快写出来才是王道
还有就是写题可以用一份代码,只是把之前的函数注释掉即可(我考试的时候就是这么干的)