背景:
最近工作需要,要给银行查看报关业务持续时间最长的企业,并求出连续年均涨幅,因此需要找出连续的年份,就自己写了个方法:
1,对list排序。
2,将每个连续子序列的起始元素下标和对应的连续长度存到map里。
3,判断是否连续:如果相邻的元素连续,每个元素的值减去对应的下标的差值(interval)肯定是相等的,否则不连续。
public List<Integer> getMaxSeqSubList(List<Integer> list) {
Collections.sort(list);
Map<Integer, Integer> map = new HashMap<>();
int interval = -1;
int lastIndex = -1;
for (int i = 0; i < list.size(); i++) {
if (i == 0) {
interval = list.get(i) - i;
map.put(i, 1);
lastIndex = i;
} else {
int thisInv = list.get(i) - i;
if (thisInv != interval) {
map.put(i, 1);
lastIndex = i;
} else {
map.put(lastIndex, map.get(lastIndex).intValue() + 1);
}
interval = thisInv;
}
}
int maxLen = 0;
List<Integer> maxList = null;
for (Entry<Integer, Integer> e : map.entrySet()) {
if (e.getValue() >= maxLen) {
maxLen = e.getValue();
maxList = list.subList(e.getKey(), e.getKey() + e.getValue());
}
}
return maxList;
}