上升下降字符串
上升下降字符串
给你一个字符串s
,请你根据下面的算法重新构造字符串:
- 从
s
中选出最小的字符,将它接在结果字符串的后面。 - 从
s
剩余字符中选出最小的字符,且该字符比上一个添加的字符大,将它接在结果字符串后面。 - 重复步骤
2
,直到你没法从s
中选择字符。 - 从
s
中选出最大的字符,将它接在结果字符串的后面。 - 从
s
剩余字符中选出最大的字符,且该字符比上一个添加的字符小,将它接在结果字符串后面。 - 重复步骤
5
,直到你没法从s
中选择字符。 - 重复步骤
1
到6
,直到s
中所有字符都已经被选过。 - 在任何一步中,如果最小或者最大字符不止一个,你可以选择其中任意一个,并将其添加到结果字符串。
请你返回将s
中字符重新排序后的结果字符串。
示例#
输入:s = "aaaabbbbcccc"
输出:"abccbaabccba"
解释:第一轮的步骤 1,2,3 后,结果字符串为 result = "abc"
第一轮的步骤 4,5,6 后,结果字符串为 result = "abccba"
第一轮结束,现在 s = "aabbcc" ,我们再次回到步骤 1
第二轮的步骤 1,2,3 后,结果字符串为 result = "abccbaabc"
第二轮的步骤 4,5,6 后,结果字符串为 result = "abccbaabccba"
输入:s = "rat"
输出:"art"
解释:单词 "rat" 在上述算法重排序以后变成 "art"
输入:s = "leetcode"
输出:"cdelotee"
题解#
/**
* @param {string} s
* @return {string}
*/
var sortString = function(s) {
let hashTable = Object.create(null);
let base = "a".charCodeAt();
for(let i=0;i<26;++i) hashTable[String.fromCharCode(base+i)] = 0;
Array.prototype.forEach.call(s, v => hashTable[v]++);
let target = "";
while(target.length < s.length){
for(let i=0;i<26;++i) {
let key = String.fromCharCode(base+i);
if(hashTable[key]){
target += key;
hashTable[key]--;
}
}
for(let i=25;i>=0;--i) {
let key = String.fromCharCode(base+i);
if(hashTable[key]){
target += key;
hashTable[key]--;
}
}
}
return target;
};
思路#
题目挺长的,其实就是普通的字符串的操作,并且由于题目中说明了是纯小写字母,也就是总量是确定的,那么就可以不使用排序去统计数量,之后的操作正好也是顺序遍历与逆序遍历即可完成的操作,拼接字符串返回即可。首先定义一个纯对象作为哈希表来记录字符串每种字符的个数,之后定义小写字符的基准数值a
的ASCII
码值,之后构建一个26
个小写字母的循环,将初始哈希表的键对应的值定义为0
,循环字符串,将统计相应字母出现的次数,定义目标字符串,如果目标字符串与给定的字符串长度相等则退出循环,之后定义一个26
字母正向循环,如果在哈希表中这个字母的值大于0
则将其拼接到目标字符串并将该值减1
,之后定义一个26
字母的逆向循环,按照同样的规则将字符拼接,之后完成循环并返回目标字符串即可。
每日一题#
https://github.com/WindrunnerMax/EveryDay
参考#
https://leetcode-cn.com/problems/increasing-decreasing-string/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理