/**
* @description 要是有一个升序数组,让我能来回遍历几次,就可以得到答案了.
* 可以使用hashMap,对象,数组这样的结构去描述这个升序的"数组",这里我使用了数组.
* @param {string} s
* @return {string}
*/
var sortString = function (s) {
const { length } = s;
// 先给字符串s排个序,sorted是一个数组,数组的下标表示字符,数组下标对应的值表示字符出现的次数
const sorted = s.split('').reduce((sorted, value) => {
const key = value.charCodeAt() - 97;
sorted[key] = (sorted[key] || 0) + 1;
return sorted;
}, []);
let results = '';
// 从sorted中收集字符到results
const collection = (results, value, index, array) => {
if (value > 0) {
results += String.fromCharCode(index + 97);
array[index] = value - 1;
}
return results;
};
while (results.length < length) {
// 收集升序的字符
results = sorted.reduce(collection, results);
// 如果第一次就选完了s中的全部字符串
if (results.length >= length) {
return results;
}
// 收集降序的字符
results = sorted.reduceRight(collection, results);
}
return results;
};