机试:字符串摘要

> 给定一个只包含字母的字符串 `s`(区分大小写),需要统计每个字符出现的次数: > > * 如果字符是**连续出现**的,则统计连续出现的次数; > * 如果字符在后面又出现(但不连续),则统计后续出现的次数; > * 输出格式为“字符+次数”的形式,并按照字符在原字符串第一次出现的顺序输出。 > > **输入示例**: > > ``` > aaabbcAab > ``` > > **输出示例**: > > ``` > a3b2c1A1a2b1 > ``` > > (这里 `a3` 表示开头连续的 3 个 a,后面的 `a2` 是后续出现的 2 个 a)

1 个回答

  • 天儿
    追风赶月莫停留,平芜尽处是春山。
    ## 思路 按顺序扫描字符串,用双指针/一次遍历把**连续相同字符**合成一段,输出“字符+该段长度”。后续再出现同字符会形成新的段再输出(自然满足你说的“连续统计;不连续则统计后续段”)。 * 时间:O(n) * 空间:O(1)(除输出外) ## Java ```java import java.io.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = br.readLine(); // 例如: aaabbcAab if (s == null || s.isEmpty()) { System.out.println(""); return; } StringBuilder out = new StringBuilder(); int n = s.length(); int i = 0; while (i < n) { char c = s.charAt(i); int j = i + 1; while (j < n && s.charAt(j) == c) j++; out.append(c).append(j - i); // 连续段长度 i = j; } System.out.println(out.toString()); // 例如: a3b2c1A1a2b1 } } ``` ## Python ```python s = input().rstrip() if not s: print("") else: i, n = 0, len(s) out = [] while i < n: j = i + 1 while j < n and s[j] == s[i]: j += 1 out.append(f"{s[i]}{j - i}") i = j print("".join(out)) ``` > 备注:如果题目要求“只保留字母”,可先用 `Character.isLetter(c)`(Java)或 `c.isalpha()`(Python)过滤再做上述统计。
    发布于 2025-08-14 13:22 •IP属地 安徽
    举报
    评论
    收藏