题解 | #小红的字符串重排#

E-小红的字符串重排

看的@Silencer76大佬题解(在吐槽区),用c++再写了一遍,写了非常详细的注释,面向像我一样的小白

(┭┮﹏┭┮)

具体思路请看代码

//		https://ac.nowcoder.com/acm/contest/92662/E
//		*	*	*	*
//		字符串重排

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int t,n;
void solve(){
	string s;
	cin>>s;
	n=s.size();
	int cnt[500];
	memset(cnt,0,sizeof(cnt));
	int mx=0;
	vector<pair<char, int>>v(n);
	vector<char> ans(n);
	for(int i=0;i<n;i++)
	{
		v[i].first=s[i],v[i].second=i;//v的key存字母,value存下标,而v的下标是0,1,2... n-1
		cnt[s[i]]++;//计数,记录每种字母的数量
		mx=max(mx,cnt[s[i]]);
	}
	if(mx>n/2)//最大的重复字母的数量不能大于s的长度的一半
	{
		cout<<-1<<endl;
		return ;
	}
	//按字母顺序排序,排完序后v按字典序的顺序排列,相同的字母挨在一起,但是字母对应的下标也会跟着变,因为这是键值对
	sort(v.begin(), v.end(), [](const pair<char,int>&v1, const pair<char,int>&v2){return v1.first<v2.first;});
	for(int i=0;i<n;i++)
	{
		//cout<<v[i].second<<" "<<v[(i+mx)%n].first<<endl;
		ans[v[i].second]=v[(i+mx)%n].first;//v[i].second为字母的下标,ans记录为该下标(v[i].second)对应的新的字母,就是v[(i+m)%n]位置的字母
	}
	cout<<string(ans.begin(), ans.end())<<endl;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

//例如:dbddbbe
//对v排完序之后是这样的:
// 0 ->  b-1	
// 1 ->  b-4
// 2 ->  b-5

// 3 ->  d-0
// 4 ->  d-2
// 5 ->  d-3
// 6 ->  e-6

//	   字母下标	  	     mx为最大的相同字母的数量
//ans[v[i].second()]   =   v[(i+mx)%n].first
//ans:下标 1 存 d-0 对应的的字母 d
//	   下标 4 存 d-2 对应的的字母 d
//	   下标 5 存 d-3 对应的的字母 d
//	   下标 0 存 e-6 对应的的字母 e
//		......
牛客竞赛题解 文章被收录于专栏

个人向题解,用于存档

全部评论
能看懂代码,但是不理解为什么要移动最大相同字母数量,求解答
1 回复 分享
发布于 2024-10-21 19:50 福建

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多&nbsp;92&nbsp;的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92&nbsp;的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99%&nbsp;做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
小浪_Coding:工作只是谋生的手段 而不是相互比较和歧视
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务