在疫情防控的特殊时期,某市开发了一款小程序用于收集市民的口罩申领信息。由于数据量庞大且规则复杂,需要编写一个高效的处理程序来筛选符合发放条件的市民,并按照特定规则输出发放名单。
核心需求可以分解为以下几个部分:
程序使用了轻量级的Record类来存储每条申请记录:
java复制static class Record {
String name, id;
int time, index;
void set(String n, String i, int t, int idx) {
this.name = n; this.id = i;
this.time = t; this.index = idx;
}
}
这种设计有以下优点:
程序使用了三种主要数据结构:
这种组合确保了:
java复制static boolean isAllDigits(String s) {
for (int i = 0; i < 18; i++) {
char c = s.charAt(i);
if (c < '0' || c > '9') return false;
}
return true;
}
优化点:
传统做法是使用SimpleDateFormat或split()方法,但这里采用更高效的手动解析:
java复制int hh = (timeStr.charAt(0) - '0') * 10 + (timeStr.charAt(1) - '0');
int mm = (timeStr.charAt(3) - '0') * 10 + (timeStr.charAt(4) - '0');
int totalMinutes = hh * 60 + mm;
优势:
每日申请记录需要按时间排序,时间相同则按输入顺序:
java复制Arrays.sort(pool, 0, validCount, (r1, r2) -> {
if (r1.time != r2.time) return r1.time - r2.time;
return r1.index - r2.index;
});
注意事项:
使用自定义的FastReader实现快速输入:
java复制static class FastReader {
private InputStream in;
private byte[] buf = new byte[65536];
private int ptr = 0, len = 0;
// 读取方法实现...
}
关键优化点:
输出使用BufferedWriter包装:
java复制PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(System.out), 65536));
java复制Map<String, Integer> lastWinDay = new HashMap<>(20000);
Set<String> illAdded = new HashSet<>(20000);
避免扩容时的rehash开销
java复制Record[] pool = new Record[10005];
for(int i = 0; i < 10005; i++) pool[i] = new Record();
减少GC压力,提高内存局部性
java复制int given = 0;
for (int i = 0; i < validCount && given < S; i++) {
Record r = pool[i];
Integer lastDay = lastWinDay.get(r.id);
if (lastDay == null || d >= lastDay + P + 1) {
out.println(r.name + " " + r.id);
lastWinDay.put(r.id, d);
given++;
}
}
关键点:
java复制if (status == 1 && illAdded.add(id)) {
illPeopleList.add(name + " " + id);
}
设计考虑:
设D为天数,T为日均申请数:
主要空间消耗:
通过以下优化确保在400ms内完成:
程序整体结构清晰,主要包含:
代码风格良好:
在实际开发中,这类程序还需要考虑: