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 小时前
leetcode:杨辉三角
算法·leetcode·职场和发展
毕竟秋山澪1 小时前
孤岛的总面积(Dfs C#
算法·深度优先
浮生如梦_3 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师5 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉5 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer5 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
wheeldown6 小时前
【数据结构】选择排序
数据结构·算法·排序算法
观音山保我别报错7 小时前
C语言扫雷小游戏
c语言·开发语言·算法
TangKenny8 小时前
计算网络信号
java·算法·华为
景鹤8 小时前
【算法】递归+深搜:814.二叉树剪枝
算法