append 函数 _构造算法 _1927_B. Following the String

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 函数是添加字符到字符串后面,第一个参数表示添加的字符个数

应该还是比较常规的题,更快写出来才是王道

还有就是写题可以用一份代码,只是把之前的函数注释掉即可(我考试的时候就是这么干的)

相关推荐
荒古前14 分钟前
龟兔赛跑 PTA
c语言·算法
Colinnian18 分钟前
Codeforces Round 994 (Div. 2)-D题
算法·动态规划
用户00993831430123 分钟前
代码随想录算法训练营第十三天 | 二叉树part01
数据结构·算法
shinelord明27 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
დ旧言~33 分钟前
专题八:背包问题
算法·leetcode·动态规划·推荐算法
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法
努力学习编程的伍大侠1 小时前
基础排序算法
数据结构·c++·算法
XiaoLeisj2 小时前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝