Java Huawei の本当の質問 - 黄金の宝箱の最大値

必要:

   貧しい木こりのアリババは、薪割りに行く途中、偶然盗賊団の宝物庫を発見しましたが、その宝物庫には0からNまでの番号が記された箱があり、それぞれの箱には番号が書かれていました。
アリババは呪文番号 k (k<N) を発音し、連続する k 個の宝箱番号の合計の最大値を求め、その最大値を出力します。
説明を入力します。
  最初の行に数値文字列を入力します。数値を区切るにはカンマを使用します。例: 2,10,-3,-8,40,5。2
  行目に呪文番号を入力します。例: 4 . 呪文番号のサイズは宝箱のサイズより小さいです。
出力説明の
   最大値

入力:

      2,10,-3,-8,40,5 ->数値文字列

      4 -> スペル番号のサイズ

出力:

      39

コーディング:

public class AiLibaba{
    public static void main(String[] args) {
        //1.列表数据
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入一个数字字串:");
        String str = scanner.nextLine();
        //字符串数组
        String[] strNum = str.split(",");
        //集合对象
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < strNum.length; i++) {
            list.add(new Integer(strNum[i])); //添加到集合中
        }
        //2.求出最大值
        System.out.print("输入咒语数字:");
        int numK = scanner.nextInt();
        //调用方法
        int max = showMax(list, numK);
        System.out.println("最大值:" + max);
    }

    /**
     *
     * @param list 列表数据
     * @param numK  咒语数字
     * @return
     */
    private static int showMax(List<Integer> list, int numK) {
//        (1)定义两个指针,先求两个指针之间的和
        int left = 0;  //左边
        int right = numK - 1; //右边
        //累计和
        int sum = 0;
        for (int i = left; i <= right; i++) {
            sum += list.get(i); //累计
        }
        //最大值
        int max = sum;

//       (2) 两个指针右移,前面的和减掉移出去的(左侧),加上移入的(右侧)这样便得到下一个连续K区间的和。
        //右移
        while (right < list.size() - 1) {
            sum -= list.get(left++);
            sum += list.get(++right);
//        再用比较的方式,如果这个区间和比之前的大,那么就记录,否则继续右移
            if (sum > max)
                max = sum;
        }
        return max;
    }
}

効果:

 

おすすめ

転載: blog.csdn.net/hlx20080808/article/details/132834124