在连续递增的数值集合中匹配到一个值

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("找不到满足条件的连续值");
        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值