这是一道华为机试题库的题,此题的思路是,首先了解字符串中每种字符出现的次数,再把次数从大到小排列,最后再根据同次数的字符,将他们单独放在数组中,根据Ascil码排列
let str = readline();//此处的readline()指的是考试中的实例字符串,我们就可以直接看作是字符串就行
//此处就是封装一个记录字符串中每种字符出现的次数
function getCount(str) {
let obj = {};
for (let i = 0; i < str.length; i++) {
if (obj[str[i]] == undefined) {
obj[str[i]] = 1;
} else {
obj[str[i]]++;
}
}
return obj;
}
let obj = getCount(str); //{a: 2, d: 3, c: 3}
let a1 = [];
for (let k in obj) {
a1.push(obj[k]);
}
//将a1中的数即字符串中字符出现的次数从大到小排列
a1 = Array.from(new Set(a1)).sort((a, b) => b - a);
// console.log(a1); //[3,2]
//遍历对象,看看有哪些等于a1每一项的
let a2 = [];
for (let i = 0; i < a1.length; i++) {
let a3 = [];
for (let k in obj) {
//a3中存储的是出现次数相同的
if (obj[k] == a1[i]) {
a3.push(k);
}
}
a2.push(a3);
}
// console.log(a2); //[["d","c"],["a"]];
//封装将数组里的字符串按照Ascil码排列的方法
function sortByA(arr) {
let str = arr.join("");
let arr2 = [];
//先转成码再比较,再转换成字符
for (let i = 0; i < str.length; i++) {
arr2.push(str.charCodeAt(i));
}
arr2 = arr2.sort((a, b) => a - b);
let arr3 = [];
arr2.forEach((item) => arr3.push(String.fromCharCode(item)));
return arr3;
}
//遍历a2,将每个数组调用sortByA(arr)方法
let a3 = a2.map((item) => {
return sortByA(item);
});
// console.log(a3); //[["c","d"],"a"]
//遍历a3,如果项为数组,则打穿数组,此处也可以用flat,但是机试题不认识这个flat,故麻烦一点,将二维数组转为字符串,字符串有[]都变成',',再把,转成空字符
let reg = /\[\]/g;
let string1 = a3.join("");
string1 = string1.replace(reg, ",");
let reg2 = /[,]/g;
string1 = string1.replace(reg2, "");
console.log(string1);