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

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

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

相关推荐
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶1 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
დ旧言~2 小时前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
张彦峰ZYF2 小时前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker2 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
爪哇学长3 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
Dola_Pan3 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi3 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse