编写函数 findEpidemics
Writing function findEpidemics
我需要创建一个函数 public Collection findEpidemics(List diagnoses, int k, int n) 来确定疾病是否是流行病,returns 是疾病的列表流行性。如果一种疾病在连续 k 天内发生超过 n 次,我们就说它是一种流行病。
Diagnosis class 是 public Diagnosis(Disease disease, int day) 并且具有函数 getDisease() 和 getDay()。
诊断列表如下所示:
Disease cholera = new Disease("cholera");
Disease dengue = new Disease("dengue");
List<Diagnosis> diagnoses = Arrays.asList(
new Diagnosis(cholera, 0), // registered cholera on day 0
new Diagnosis(cholera, 0),
new Diagnosis(cholera, 1),
new Diagnosis(dengue, 2),
new Diagnosis(dengue, 2),
// we have a gap here
new Diagnosis(cholera, 6),
所以我所做的是制作一个哈希图集合,其中包含每天发生的所有疾病,因此它可能看起来像这样:{{cholera, 0}=2, {cholera, 1} =1, {登革热, 2}=2, {霍乱, 6}=1}
public Collection<String> findEpidemics(List<Diagnosis> diagnoses, int k, int n) {
// first we count occurrences
Map<DiagnosisMetric, Long> collect = diagnoses.stream().
collect(Collectors.groupingBy(DiagnosisMetric::new, counting()));
// check for epidemic
for(int i=0; i<collect.size(); i++){
for(int j=0; j<k; j++){
???
}
}
}
我有点卡在检查疾病是否是流行病的部分,所以我卡在如何遍历哈希图并检查某种疾病的发生是否超过 n 的问题连续 k 天。
获得映射后,您可以通过在条目列表上滑动 window 来继续检查流行病。
public static void findEpidemics(List<Diagnosis> diagnoses, int k, int n) {
Map<DiagnosisMetric, Long> collect = diagnoses.stream().collect(Collectors.groupingBy(DiagnosisMetric::new, counting()));
Map<String, List<Map.Entry<DiagnosisMetric, Long>>> diseaseByName = collect.entrySet().stream().collect(Collectors.groupingBy(diagnosisMetricLongEntry -> diagnosisMetricLongEntry.getKey().getDiagnosis().getDisease().getName()));
List<String> pandemics = diseaseByName.entrySet().stream().collect(Collectors.partitioningBy(e -> isPandemic(e, n, k))).getOrDefault(true, Collections.emptyList()).stream().map(m -> m.getKey()).collect(Collectors.toList());
System.out.println(pandemics);
}
public static boolean isPandemic(Map.Entry<String, List<Map.Entry<DiagnosisMetric, Long>>> e, int n, int k) {
List<Map.Entry<DiagnosisMetric, Long>> collect = e.getValue().stream().sorted(Comparator.comparingInt(o -> o.getKey().getDiagnosis().getDay())).collect(Collectors.toList());
int s = collect.size();
Long sum = 0L;
if(s < k) {
return false;
}
Queue<Long> q = new ArrayDeque<>();
for(int i = 0; i < k; i++) {
Long value = collect.get(i).getValue();
q.add(value);
sum += value;
if(sum > n) {
return true;
}
}
for(int j = k; j < s; j++) {
Long value = collect.get(j).getValue();
Long lastValue = q.poll();
sum = sum - lastValue;
q.add(value);
sum += value;
if(sum > n) {
return true;
}
}
return false;
}
该实现相当简陋,但您可以为此使用滑动 window 技术。
我需要创建一个函数 public Collection findEpidemics(List diagnoses, int k, int n) 来确定疾病是否是流行病,returns 是疾病的列表流行性。如果一种疾病在连续 k 天内发生超过 n 次,我们就说它是一种流行病。 Diagnosis class 是 public Diagnosis(Disease disease, int day) 并且具有函数 getDisease() 和 getDay()。
诊断列表如下所示:
Disease cholera = new Disease("cholera");
Disease dengue = new Disease("dengue");
List<Diagnosis> diagnoses = Arrays.asList(
new Diagnosis(cholera, 0), // registered cholera on day 0
new Diagnosis(cholera, 0),
new Diagnosis(cholera, 1),
new Diagnosis(dengue, 2),
new Diagnosis(dengue, 2),
// we have a gap here
new Diagnosis(cholera, 6),
所以我所做的是制作一个哈希图集合,其中包含每天发生的所有疾病,因此它可能看起来像这样:{{cholera, 0}=2, {cholera, 1} =1, {登革热, 2}=2, {霍乱, 6}=1}
public Collection<String> findEpidemics(List<Diagnosis> diagnoses, int k, int n) {
// first we count occurrences
Map<DiagnosisMetric, Long> collect = diagnoses.stream().
collect(Collectors.groupingBy(DiagnosisMetric::new, counting()));
// check for epidemic
for(int i=0; i<collect.size(); i++){
for(int j=0; j<k; j++){
???
}
}
}
我有点卡在检查疾病是否是流行病的部分,所以我卡在如何遍历哈希图并检查某种疾病的发生是否超过 n 的问题连续 k 天。
获得映射后,您可以通过在条目列表上滑动 window 来继续检查流行病。
public static void findEpidemics(List<Diagnosis> diagnoses, int k, int n) {
Map<DiagnosisMetric, Long> collect = diagnoses.stream().collect(Collectors.groupingBy(DiagnosisMetric::new, counting()));
Map<String, List<Map.Entry<DiagnosisMetric, Long>>> diseaseByName = collect.entrySet().stream().collect(Collectors.groupingBy(diagnosisMetricLongEntry -> diagnosisMetricLongEntry.getKey().getDiagnosis().getDisease().getName()));
List<String> pandemics = diseaseByName.entrySet().stream().collect(Collectors.partitioningBy(e -> isPandemic(e, n, k))).getOrDefault(true, Collections.emptyList()).stream().map(m -> m.getKey()).collect(Collectors.toList());
System.out.println(pandemics);
}
public static boolean isPandemic(Map.Entry<String, List<Map.Entry<DiagnosisMetric, Long>>> e, int n, int k) {
List<Map.Entry<DiagnosisMetric, Long>> collect = e.getValue().stream().sorted(Comparator.comparingInt(o -> o.getKey().getDiagnosis().getDay())).collect(Collectors.toList());
int s = collect.size();
Long sum = 0L;
if(s < k) {
return false;
}
Queue<Long> q = new ArrayDeque<>();
for(int i = 0; i < k; i++) {
Long value = collect.get(i).getValue();
q.add(value);
sum += value;
if(sum > n) {
return true;
}
}
for(int j = k; j < s; j++) {
Long value = collect.get(j).getValue();
Long lastValue = q.poll();
sum = sum - lastValue;
q.add(value);
sum += value;
if(sum > n) {
return true;
}
}
return false;
}
该实现相当简陋,但您可以为此使用滑动 window 技术。