字符统计及重排
题目描述
给出一个仅包含字母的字符串, 不包含空格, 统计字符串中各个字母(区分大小写)出现的次数,
并按照字母出现次数从大到小的顺序. 输出各个字母及其出现次数.
如果次数相同, 按照自然顺序进行排序, 且小写字母在大写字母之前.
输入描述
输入一行, 为一个仅包含字母的字符串.
输出描述
按照字母出现次数从大到小的顺序输出各个字母和字母次数, 用英文分号分隔, 注意末尾的分号.
字母和次数间用英文冒号分隔.
示例1
输入:
xyxyXX
输出:
x:2;y:2;X:2;
示例2
输入:
abababb
输出:
b:4;a:3;
说明: b的出现个数比a多,故b排在a之前
题解
Python
def solution1():
# 创建计数数组
# 读取输入, 并统计所有字母出现的次数
# 统计出现的最多次数
# 然后逆向遍历所有的次数, 并打印结果
chars = [0] * 256
for char in input().strip():
index = ord(char)
chars[index] += 1
max_count = max(chars)
out = []
for count in range(max_count, 0, -1):
# 遍历所有的小写字母
for char_index in range(ord('a'), ord('z') + 1):
if chars[char_index] == count:
out.append("{}:{}".format(chr(char_index), count))
# 再遍历所有的大写字母
for char_index in range(ord('A'), ord('Z') + 1):
if chars[char_index] == count:
out.append("{}:{}".format(chr(char_index), count))
# 打印结果
s = ";".join(out)
print(s)
def solution2():
# 读取输入
# 创建计数字典
# 统计所有字母出现的次数
# 然后转换成数组, 并对其进行排序
chars = dict()
for char in input().strip():
if char not in chars:
chars[char] = 0
chars[char] += 1
print(chars_list)
# 打印结果
s = ";".join(F"{char}:{count}" for (char, count) in chars_list)
print(s)
def main():
solution1()
if __name__ == "__main__":
main()
Rust
use std::io::{stdin, BufRead}; fn main() { // 创建计数数组 // 读取输入, 并统计所有字母出现的次数 // 统计出现的最多次数 // 然后逆向遍历所有的次数, 并打印结果 let mut chars = [0_usize; 256]; let mut line = String::new(); let ret = stdin().lock().read_line(&mut line); assert!(ret.is_ok()); for byte in line.trim().bytes() { let index: usize = byte as usize; chars[index] += 1; } let max_count: usize = chars.iter().max().copied().unwrap(); let mut out = Vec::new(); for count in (1..=max_count).rev() { // 遍历所有的小写字母 for byte in b'a'..=b'z' { let index = byte as usize; if chars[index] == count { out.push(format!("{}:{count}", char::from_u32(byte as u32).unwrap())); } } // 遍历所有的大写字母 for byte in b'A'..=b'Z' { let index = byte as usize; if chars[index] == count { out.push(format!("{}:{count}", char::from_u32(byte as u32).unwrap())); } } } // 打印结果 let s = out.join(";"); println!("{s}"); }
C++
#include <array>
#include <iostream>
#include <vector>
int main() {
// 创建计数数组
// 读取输入, 并统计所有字母出现的次数
// 统计出现的最多次数
// 然后逆向遍历所有的次数, 并打印结果
const size_t kNumChars = 256;
std::array<int, kNumChars> chars;
for (int i = 0; i < kNumChars; ++i) {
chars[i] = 0;
}
std::string line;
std::getline(std::cin, line);
for (char chr : line) {
int index = static_cast<int>(chr);
chars[index] += 1;
}
const int max_count = *std::max(chars.cbegin(), chars.cend());
std::vector<std::string> out;
const size_t kBufLen = 64;
char buf[kBufLen];
for (int count = max_count; count > 0; --count) {
// 遍历所有的小写字母
for (int char_index = static_cast<int>('a'); char_index <= static_cast<int>('z'); ++char_index) {
if (chars[char_index] == count) {
const int s_len = std::snprintf(buf, kBufLen, "%c:%d", static_cast<char>(char_index), count);
out.emplace_back(buf, s_len);
}
}
// 再遍历所有的大写字母
for (int char_index = static_cast<int>('A'); char_index <= static_cast<int>('Z'); ++char_index) {
if (chars[char_index] == count) {
const int s_len = std::snprintf(buf, kBufLen, "%c:%d", static_cast<char>(char_index), count);
out.emplace_back(buf, s_len);
}
}
}
// 打印结果
for (int i = 0; i + 1 < out.size(); ++i) {
std::cout << out[i] << ";";
}
std::cout << out[out.size() - 1] << std::endl;
return 0;
}