Bootstrap

华为OD机考题加答案之字符统计及重排

【字符统计及重排】给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及 其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前,

输入描述: 输入一行,为一个仅包含字母的字符串

输出描述: 按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意未尾的分号,字母和次数间用英文冒号分隔,

示例:

1.输入: xyxyXX

输出:x:2;y:2;X:2;

说明: 每个字符出现的次数为2 故x排在y之前,而小写字母x在大写X之前

2.输入: abababb

输出:b:4;a.3

说明: b的出现个数比a多 故排在a前

function countAndSortLetters(input: string): string {
  const letterCount = new Map<string, number>();

  // 统计每个字母出现的次数
  for (const char of input) {
    if (letterCount.has(char)) {
      letterCount.set(char, letterCount.get(char)! + 1);
    } else {
      letterCount.set(char, 1);
    }
  }

  // 将统计结果转换为数组
  const entries = Array.from(letterCount.entries());
  // 按照出现次数从大到小排序,如果次数相同,按字母自然顺序排序
  entries.sort((a, b) => {
    if (a[1] === b[1]) {
      return a[0].localeCompare(b[0]);
    }
    return b[1] - a[1];
  });
  // 构建输出字符串
  const result = entries.map(entry => `${entry[0]}:${entry[1]}`).join(';') + ';';
  return result;
}

// 测试示例
console.log(countAndSortLetters("xyxyXX")); // 输出: x:2;y:2;X:2;
console.log(countAndSortLetters("abababb")); // 输出: b:4;a:3;

 

 

;