Java面试必刷:手把手教你用Scanner和char数组搞定字符串统计(附常见错误避坑)
Java面试实战:从字符串统计到日期计算的避坑指南
刚接触Java编程的开发者,在技术笔试中经常会遇到一些看似简单却暗藏陷阱的基础题目。字符串统计和日期计算这两类问题,几乎出现在所有初级Java开发岗位的笔试环节。本文将通过两个典型案例,带你深入理解如何用Scanner和char数组高效解决这些问题,同时避开那些让无数候选人栽跟头的常见错误。
1. 字符串统计:字符分类的艺术
字符串统计是Java笔试中最基础的题型之一,要求统计输入字符串中字母、数字、空格和其他字符的数量。看似简单,但实际编码时却容易在多个环节出错。
1.1 输入处理与字符数组转换
使用Scanner获取用户输入是最直接的方式,但要注意处理输入流的关闭问题。虽然笔试中可能不严格要求,但在实际开发中这是个好习惯。
Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); char[] chars = input.toCharArray();常见错误1:忘记调用nextLine()而误用next(),后者只会读取到第一个空格前的字符串。
1.2 字符分类逻辑实现
遍历字符数组时,分类判断的顺序和条件表达式是关键。字母判断要同时考虑大小写,数字判断要注意字符比较。
int letters = 0, digits = 0, spaces = 0, others = 0; for (char c : chars) { if (Character.isLetter(c)) { letters++; } else if (Character.isDigit(c)) { digits++; } else if (c == ' ') { spaces++; } else { others++; } }常见错误2:
- 使用
a[i]>='A'&&a[i]<'Z'这样的表达式,漏掉了'Z'本身 - 将比较运算符写反,如
=>代替>= - 忘记处理大小写字母,只检查了小写或大写
1.3 边界情况与测试验证
完善的解决方案应该考虑各种边界情况:
- 空字符串输入
- 全角字符和半角字符混合
- 特殊Unicode字符
- 长字符串的性能考量
提示:笔试时至少应该测试空字符串、纯数字、纯字母和混合输入的几种情况
2. 日期天数计算:细节决定成败
计算某日期是该年的第几天,这类题目考察的是条件判断和逻辑组织能力,以及处理边界条件的细致程度。
2.1 闰年判断的正确实现
闰年判断是日期计算的基础,规则容易被记错或实现错误。
boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; int febDays = isLeapYear ? 29 : 28;常见错误3:
- 错误地将整除条件写为
y/4 == 0而不是y%4 == 0 - 遗漏了能被100整除但不能被400整除不是闰年的例外情况
- 将逻辑运算符
&&和||用错位置
2.2 月份天数累加策略
使用switch语句按月累加天数时,有两个关键点需要注意:break语句和累加顺序。
int dayOfYear = day; switch (month - 1) { // 从上一个月份开始累加 case 11: dayOfYear += 30; case 10: dayOfYear += 31; case 9: dayOfYear += 30; case 8: dayOfYear += 31; case 7: dayOfYear += 31; case 6: dayOfYear += 30; case 5: dayOfYear += 31; case 4: dayOfYear += 30; case 3: dayOfYear += 31; case 2: dayOfYear += febDays; case 1: dayOfYear += 31; }常见错误4:
- 忘记在每个case后加break导致穿透(除非故意利用穿透特性)
- 累加顺序错误,应该从1月开始向上累加
- 2月份天数没有单独处理,直接使用固定值28天
2.3 输入验证与异常处理
健壮的日期计算应该包括:
- 月份范围验证(1-12)
- 日期有效性检查(如4月没有31日)
- 非法输入处理(非数字输入)
虽然笔试可能不要求这些,但实际开发中必不可少。
3. 代码优化与可读性提升
笔试不仅要写出能运行的代码,还要考虑代码质量和可维护性。
3.1 使用工具类简化代码
Java标准库提供了许多有用的工具类:
// 替代手动字符分类 Character.isLetter(c); Character.isDigit(c); Character.isWhitespace(c); // 更简单的闰年判断 Year.of(year).isLeap();3.2 提取方法提高可读性
将复杂逻辑拆分为多个方法:
private static boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } private static int getFebDays(int year) { return isLeapYear(year) ? 29 : 28; }3.3 使用枚举或数组存储月份天数
替代冗长的switch语句:
int[] daysInMonth = {31, febDays, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int i = 0; i < month - 1; i++) { dayOfYear += daysInMonth[i]; } dayOfYear += day;4. 笔试实战技巧与心理准备
技术笔试不仅是编码能力的测试,也是心理素质和应试技巧的考验。
4.1 时间分配策略
- 先通读所有题目,评估难度
- 从最有把握的题目开始
- 为每道题设置时间上限
- 留出最后10分钟检查
4.2 常见陷阱自查清单
编码完成后,快速检查以下常见错误:
- 比较运算符方向是否正确
- 边界条件是否处理(如空输入、极值)
- 循环和条件语句的括号匹配
- switch语句是否有遗漏的break
- 变量初始化是否正确
4.3 调试与问题定位技巧
当程序行为不符合预期时:
- 添加打印语句输出中间结果
- 检查边界条件的处理
- 逐步注释代码定位问题区域
- 用简单测试用例验证
在IDE中开发时,可以充分利用调试器设置断点和观察变量。