Java实现12小时制转24小时制(HackerRank)代码问题排查
咱们来一步步排查你代码里的问题,看看为什么有些测试用例失败:
你的代码里的核心问题
字符串比较用
==而非equals()
Java中==比较的是对象引用,不是字符串内容。你最后判断12:00:00AM和12:00:00PM时,s == "xxx"永远不会返回true,因为输入字符串和字面量的内存引用不同,导致这两个特殊时间的修正逻辑完全失效。PM时间的12点处理逻辑错误
当输入是12PM时,你的代码会把小时加12变成24,再转成0,这就把12PM错误地变成了00:xx:xx,而正确结果应该保持12不变。AM时间的12点处理不完整
你只单独处理了12:00:00AM这个特例,但像12:30:45AM这类时间,你的代码会输出12:30:45,而正确结果应该是00:30:45,因为12AM属于午夜,需要转成00点。rest的获取方式不够健壮
你通过固定索引循环截取字符串的方式虽然对标准输入有效,但依赖输入的固定长度,不如直接从拆分后的数组中提取分钟和秒更可靠、易读。
修正后的代码
下面是修复了所有问题的版本,逻辑更清晰且覆盖所有测试场景:
import java.io.*; import java.util.*; public class Solution { static String timeConversion(String s) { // 拆分时间为小时、分钟、秒+周期三部分 String[] timeParts = s.split(":"); int hour = Integer.parseInt(timeParts[0]); String minute = timeParts[1]; // 从第三部分中拆分出秒和AM/PM标识 String secondWithPeriod = timeParts[2]; String second = secondWithPeriod.substring(0, 2); String period = secondWithPeriod.substring(2); // 处理24小时制转换逻辑 if (period.equalsIgnoreCase("PM")) { // PM时:12PM保持12,其他小时加12 if (hour != 12) { hour += 12; } } else { // AM时:12AM转为0,其他小时保持不变 if (hour == 12) { hour = 0; } } // 格式化小时为两位数字(自动补0) String militaryHour = String.format("%02d", hour); // 拼接最终结果 return militaryHour + ":" + minute + ":" + second; } private static final Scanner scan = new Scanner(System.in); public static void main(String[] args) { String s = scan.nextLine(); String result = timeConversion(s); System.out.println(result); } }
关键修改点说明
- 直接从拆分后的数组提取分钟、秒和周期,避免固定索引的脆弱性;
- 重新梳理了AM/PM转换逻辑:
- PM场景:仅非12点的小时加12,12PM保持12;
- AM场景:仅12点转为0,其他AM小时原样保留;
- 用
String.format("%02d", hour)自动格式化小时为两位数字,无需手动判断拼接; - 用
equalsIgnoreCase()判断周期,兼容大小写输入(更健壮); - 移除了无效的字符串
==比较,新逻辑已覆盖所有12点的特殊情况。
内容的提问来源于stack exchange,提问作者Rahul P
相关产品推荐
相关产品推荐

