(C卷,100分)- 字符统计及重排(Java & JS & Python)

题目描述

给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,

并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。

如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。

输入描述

输入一行,为一个仅包含字母的字符串。

输出描述

按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;

字母和次数间用英文冒号分隔。

用例

输入 xyxyXX
输出 x:2;y:2;X:2;
说明 每个字符出现的个数都是2,故x排在y之前,而小写字母x在X之前
输入 abababb
输出 b:4;a:3;
说明 b的出现个数比a多,故b排在a之前

题目解析

本题需要注意的是,题目要求:

如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。

自然顺序排序,看用例1,应该就是ASCII升序。而后面又要求,小写字母在大写字母之前,小写字母的ASCII码值是大于大小字母的,因此这里又相当于ASCII降序。

因此排序时,如果遇到次数相同的,则需要判断比较的两个字母是否 都为大写 或者 都为小写,若是,则此时按照ASCII码值升序,若不是,则小写字母排在前面,大写字母排在后面。

Java算法源码

import java.util.HashMap;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    System.out.println(getResult(s));
  }

  public static String getResult(String s) {
    HashMap<Character, Integer> letter = new HashMap<>();

    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      letter.put(c, letter.getOrDefault(c, 0) + 1);
    }

    StringBuilder sb = new StringBuilder();

    letter.entrySet().stream()
        .sorted(
            (a, b) -> {
              if (a.getValue() - b.getValue() != 0) {
                return b.getValue() - a.getValue();
              } else {
                if ((isLower(a.getKey()) && isLower(b.getKey()))
                    || (isUpper(a.getKey()) && isUpper(b.getKey()))) {
                  return a.getKey() - b.getKey();
                } else {
                  if (isUpper(a.getKey())) return 1;
                  else return -1;
                }
              }
            })
        .forEach(entry -> sb.append(entry.getKey() + ":" + entry.getValue() + ";"));

    return sb.toString();
  }

  public static boolean isLower(char letter) {
    return letter >= 'a' && letter <= 'z';
  }

  public static boolean isUpper(char letter) {
    return letter >= 'A' && letter <= 'Z';
  }
}

JS算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (line) => {
  console.log(getResult(line));
});

function getResult(s) {
  const letter = {};

  for (let c of s) {
    letter[c] = (letter[c] ?? 0) + 1;
  }

  const arr = [];

  for (let key in letter) {
    arr.push([key, letter[key]]);
  }

  arr.sort((a, b) => {
    if (a[1] != b[1]) return b[1] - a[1];

    if ((isLower(a[0]) && isLower(b[0])) || (isUpper(a[0]) && isUpper(b[0]))) {
      return a[0] > b[0] ? 1 : -1;
    } else {
      if (isUpper(a[0])) return 1;
      else return -1;
    }
  });

  return arr.map((kv) => kv[0] + ":" + kv[1] + ";").join("");
}

function isLower(letter) {
  return letter >= "a" && letter <= "z";
}

function isUpper(letter) {
  return letter >= "A" && letter <= "Z";
}

Python算法源码

# 输入获取
import functools

s = input()


def cmp(a, b):
    if a[1] != b[1]:
        return b[1] - a[1]

    if (a[0].islower() and b[0].islower()) or (a[0].isupper() and b[0].isupper()):
        return 1 if a[0] > b[0] else -1
    else:
        if a[0].isupper():
            return 1
        else:
            return -1


# 算法入口
def getResult():
    letter = {}

    for c in s:
        letter[c] = letter.get(c, 0) + 1

    letterList = list(letter.items())

    letterList.sort(key=functools.cmp_to_key(cmp))

    return "".join(list(map(lambda x: f":;", letterList)))


# 算法调用
print(getResult())

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?