題目: https://leetcode-cn.com/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/
解法一: 暴力解法
根據(jù)題目的意思, 每個(gè)人和對(duì)應(yīng)時(shí)間的關(guān)系類似于Map的關(guān)系(一對(duì)多), 所以, 該題使用哈希表可以解決.
import java.math.BigDecimal;
class Solution {
public List<String> alertNames(String[] keyName, String[] keyTime) {
List<String> ans = new ArrayList<>();
Map<String, List<Float>> namesTime = new HashMap<>();
int len = keyName.length;
for (int i = 0; i < len; i++) {
String currTime = keyTime[i];
if (!namesTime.containsKey(keyName[i])) {
List<Float> tmp = new ArrayList<>();
tmp.add(timeToFloat(keyTime[i]));
namesTime.put(keyName[i], tmp);
continue;
}
namesTime.computeIfPresent(keyName[i], (s, floats) -> {
floats.add(timeToFloat(currTime));
return floats;
});
}
for (Map.Entry entry : namesTime.entrySet()) {
List<Float> value = (List<Float>) entry.getValue();
value.sort((o1, o2) -> Float.compare(o1, o2));
for (int i = 0; i < value.size() - 2; i++) {
// 注意: 如果直接浮點(diǎn)數(shù)相減會(huì)不準(zhǔn)確, 這里需要保留2位小數(shù)
BigDecimal bigDecimal = new BigDecimal(value.get(i) - value.get(i + 2));
Float period = Math.abs(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue());
if (period.compareTo(1f) <= 0) {
ans.add((String) entry.getKey());
break;
}
}
}
ans.sort(Comparator.naturalOrder());
return ans;
}
private float timeToFloat(String time) {
return Float.valueOf(time.replace(":", "."));
}
}