Java统计功能实现:禁用数组、限制字符串操作的解决方案咨询
实现技巧
核心思路是用单个数值变量替代数组存储所有统计结果,同时直接用Scanner原生读取能力去掉所有不必要的字符串拼接操作:
- 存储层替换:原逻辑每周仅需存储1个0~9的最小值,共18周,刚好可以用单个
long类型变量按十进制位存储所有结果。提前确定位权:第1周的结果存在1017位,第2周存在1016位,依次类推,每计算完一周的最小值,就将总结果 += 最小值 * 当前位权,后续位权每次除以10即可,完全不需要数组。 - 去掉字符串拼接:全程依托Scanner的读取能力做格式校验,不需要自己拼接字符串做匹配:
- 周次校验:先读取第一个token,直接用
equals校验是否等于固定字符串"Week",再读取周次数字,直接比较数字是否等于当前预期的周次,无任何字符串拼接操作。 - 数据读取:每周对应5个数字,直接循环5次读取字节值,读取过程中同步计算最小值,不需要拼接字符串做格式匹配。
- 周次校验:先读取第一个token,直接用
- 输出适配:18周处理完成后,初始化除数为10^17,每次取总结果除以除数得到当前周的最小值,逐段输出内容避免字符串拼接,完成输出后取余更新总结果、除数除以10即可。
符合要求的代码实现
public static void main(String args[]) { Scanner sc = new Scanner(System.in); long allResult = 0; long weight = 100000000000000000L; byte validWeekCount = 0; byte order = -1; while (++order < 18) { byte minVal = 9; // 校验输入是否结束 if (!sc.hasNext()) { break; } // 校验Week标签 String weekTag = sc.next(); if (!"Week".equals(weekTag)) { System.err.println("Illegal Argument"); sc.close(); System.exit(-1); } // 校验周次顺序 if (!sc.hasNextByte()) { System.err.println("Illegal Argument"); sc.close(); System.exit(-1); } byte currentWeek = sc.nextByte(); if (currentWeek != order + 1) { System.err.println("Illegal Argument"); sc.close(); System.exit(-1); } // 读取5个数字计算最小值 for (byte i = 0; i < 5; i++) { if (!sc.hasNextByte()) { System.err.println("Illegal Argument"); sc.close(); System.exit(-1); } byte num = sc.nextByte(); if (num < minVal) { minVal = num; } } allResult += minVal * weight; weight /= 10; validWeekCount++; } // 输出统计结果 long div = 100000000000000000L; for (byte i = 0; i < validWeekCount; i++) { long currentMin = allResult / div; System.out.print("Week "); System.out.print(i + 1); System.out.print(" "); for (long j = 0; j < currentMin; j++) { System.out.print("="); } System.out.println(">"); allResult %= div; div /= 10; } sc.close(); }
内容的提问来源于stack exchange,提问作者WildBoar
相关产品推荐
相关产品推荐

