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
相关产品推荐
相关产品推荐

