输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。例如输入aaddccdc,输出cda

这是一道华为机试题库的题,此题的思路是,首先了解字符串中每种字符出现的次数,再把次数从大到小排列,最后再根据同次数的字符,将他们单独放在数组中,根据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);

猜你喜欢

转载自blog.csdn.net/weixin_68067009/article/details/124514557