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

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

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

相关推荐
怕浪猫19 分钟前
不用摄像机,我把历史故事做成竖屏视频
算法·面试·github
郝学胜-神的一滴1 小时前
AI 编程智能体 16:从零基础搭建到精细化优化
人工智能·python·算法·语言模型·langchain·pip
喜欢打篮球的普通人1 小时前
AI 编译器内存分配算法:从静态/动态划分到内存复用
人工智能·算法
mjhcsp2 小时前
Code date creation v8.0 竞赛数据生成与对拍实战指南
算法·ai·深度优先·cdc
小郎君6582 小时前
keep-alive 页面怎么“真刷新”?别改外层 key——一个 refreshVersion 的完整实现
vue.js·算法
瑶池酒剑仙3 小时前
C++变量初始化五法完全指南:默认/拷贝/直接/列表/值初始化与窄化转换陷阱(青云之志)
c语言·开发语言·数据结构·c++·算法·visual studio
用户238003099453 小时前
从零开始实现扫雷游戏(C 语言控制台版)
算法
国科安芯3 小时前
星上计算的第一道防线:低轨遥感卫星载荷处理链中的AS32S601型抗辐射MCU—— 面向高分辨率成像与在轨智能处理的场景化综述
大数据·网络·人工智能·单片机·算法·低轨卫星·抗辐射
thusloop3 小时前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
瓦瓦gogo3 小时前
学回溯算法时,我先弄明白了怎么“退回来”
算法