You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java面试题优化:统计去标点句子中重复单词的更简洁实现?

面试算法题:重复单词统计的时长评估与简洁实现

嘿,作为过来人先给你吃个定心丸:Java面试里手写这类字符串处理+统计的算法题,花5分钟真的完全合格!毕竟你得先理清需求、琢磨清楚边界情况(比如大小写算不算同一个单词?标点怎么处理干净?),再动手写代码。如果想进一步提速,平时多刷这类题型,熟悉Java的字符串API和Stream操作,速度自然会上来。

接下来给你一个更简洁的实现,用Java 8+的Stream API能把代码压缩到非常紧凑,同时可读性也不差:

import java.util.Arrays;
import java.util.stream.Collectors;

public class DuplicateWordCounter {
    public static int countDuplicateWords(String sentence) {
        // 清洗字符串+统计重复单词
        return (int) Arrays.stream(
                // 去除所有非字母、数字、空格的字符,再按任意数量空格分割
                sentence.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+")
            )
            .filter(word -> !word.isBlank()) // 过滤空字符串(处理首尾标点或多空格的情况)
            .collect(Collectors.groupingBy(
                String::toLowerCase, // 统一转小写,大小写视为同一单词(可根据题目要求去掉)
                Collectors.counting()
            ))
            .values()
            .stream()
            .filter(count -> count > 1)
            .count();
    }

    public static void main(String[] args) {
        String testSentence = "Hi, hi! I love Java, Java is great. Great, right?";
        System.out.println(countDuplicateWords(testSentence)); // 输出:3(hi、java、great)
    }
}

写法亮点解析:

  • 一步到位的字符串清洗:用replaceAll直接过滤掉所有标点,不用逐个字符判断;split("\\s+")能处理任意数量的空格,避免多空格导致的空字符串问题。
  • 流式统计更高效:用groupingBy+counting一行完成单词计数,比手动遍历HashMap要简洁得多。
  • 灵活适配需求:如果题目要求大小写敏感,把String::toLowerCase换成Function.identity()就行,改动成本极低。

面试时还有个小技巧:写代码前先跟面试官确认边界条件,比如“单词包含数字吗?大小写算不同单词吗?”,这种沟通能让面试官觉得你考虑问题很周全,比单纯写对代码加分更多~

内容的提问来源于stack exchange,提问作者answerSeeker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:01:21