1. 背景
当前给出一个还款金额x,以及一个所有期次的还款金额的集合y(还款金额递增),需要判断还款金额x,是哪一期的还款金额,或者是哪连续几期的还款金额之和(因为会有提前还款,比如提前还1,2,3期)。
2. 实现
/**
*
* @param arr 每期应还本金集合
* @param target 目标金额 (实还本金)
* @return 期次
*/
public static int[] findSubArrayIndex(List<BigDecimal> arr, BigDecimal target) {
int n = arr.size();
int start = 0;
int end = 0;
BigDecimal currSum = arr.get(0);
while (start < n) {
// 如果当前和等于目标值,返回起始索引和结束索引
if (currSum.compareTo(target) == 0) {
return new int[]{start + 1, end + 1};
}
// 如果当前和小于目标值或者已经到达数组末尾,则将结束索引右移一位,并将其值加入当前和
if (currSum.compareTo(target) == -1) {
if (end < n - 1) {
end++;
}
currSum = currSum.add(arr.get(end));
}
// 如果当前和大于目标值,则将起始索引右移一位,并将其值从当前和中减去
else if (currSum.compareTo(target) > 0) {
currSum = currSum.subtract(arr.get(start));
start++;
}
}
return null;
}
/**
*
* 验证
*/
public static void main(String[] args) {
BigDecimal a = new BigDecimal("70.34");
List<BigDecimal> list = new ArrayList<>();
list.add(BigDecimal.valueOf(34.03));
list.add(BigDecimal.valueOf(34.48));
list.add(BigDecimal.valueOf(34.94));
list.add(BigDecimal.valueOf(35.40));
list.add(BigDecimal.valueOf(35.86));
list.add(BigDecimal.valueOf(36.33));
list.add(BigDecimal.valueOf(36.81));
list.add(BigDecimal.valueOf(36.64));
list.add(BigDecimal.valueOf(38.41));
int[] result = findSubArrayIndex(list, a);
if (result != null) {
String string = Arrays.toString(result);
System.out.println(string);
System.out.println("目标值 " + a + " 等于数组中下标 " + result[0] + " 到 " + result[1] + " 的连续值");
System.out.println(result[0] == result[1] ? Arrays.toString(new int[]{result[0]}) : Arrays.toString(result));
} else {
System.out.println("找不到满足条件的连续值");
}
}