猿问

可以有效存储和检查任何三个连续添加的元素的总数是否等于给定总数的数据结构

例子:

  • 没有总计的空容器。

  • 添加{1,2,3},这意味着仅存在一个总数(1 + 2 + 3 = 6)。

  • 现在添加{4}元素,它从{2,3,4}创建额外的总数。现在将有两个总数(1 + 2 + 3 = 6和2 + 3 + 4 = 9)。


皈依舞
浏览 134回答 2
2回答

慕娘9325324

您可以结合使用列表(以跟踪添加的元素)和从总和到元素的映射的组合:public class SummingList {&nbsp; &nbsp; // Store the elements added in order&nbsp; &nbsp; private List<Integer> elements = new ArrayList<>();&nbsp; &nbsp; // Map form the sum to the index(es) that sum up to that number&nbsp; &nbsp; private Map<Integer, List<Integer>> sumIndexes;&nbsp; &nbsp; /** Expose elements from the list:&nbsp; &nbsp; public int get(int index) {&nbsp; &nbsp; &nbsp; &nbsp; return list.get(index);&nbsp; &nbsp; }&nbsp; &nbsp; /** Add an element to the data structure */&nbsp; &nbsp; public add(int element) {&nbsp; &nbsp; &nbsp; &nbsp; list.add(element);&nbsp; &nbsp; &nbsp; &nbsp; // If there are now at least three elements in the data structure,&nbsp; &nbsp; &nbsp; &nbsp; // sum them:&nbsp; &nbsp; &nbsp; &nbsp; int size = list.size();&nbsp; &nbsp; &nbsp; &nbsp; if (size >= 3) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int sum = list.get(size - 3) + list.get(size - 2) + list.get(size - 1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sumIndexes.computeIfAbsent(sum, k -> new LinkedList<>()).add(size - 3);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp;&nbsp; &nbsp; &nbsp;* Returns a list of indexes in the list, where each index is the beginning&nbsp; &nbsp; &nbsp;* of a series of three elements who's sum is the passed {@code sum}.&nbsp; &nbsp; &nbsp;* If no such indexes exist, an empty list is returned.&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public List<Integer> getSequencesWIthSum(int sum) {&nbsp; &nbsp; &nbsp; &nbsp; return Collections.unmodifiable(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sumIndexes.getOrDefault(sum, Collections.emptyList());&nbsp; &nbsp; }}笔记:虽然这个示例中的API很奇怪,但是它显示了该思想的基础。可以很容易地对其进行调整,以返回更适合您需求的东西。如果您需要概括实现以容纳更大系列的总和,而不仅仅是三胞胎,那么缓存“滚动窗口”总和可能是个好主意。为了使代码更简洁,我没有这样做。
随时随地看视频慕课网APP

相关分类

Java
我要回答