Java Huawei 실제 질문 - 황금 보물 상자의 최대 가치

필요:

   가난한 나무꾼 알리바바는 장작을 베러 가던 길에 우연히 도적단의 보물창고를 발견했는데, 보물창고에는 0부터 N까지의 숫자가 적힌 상자가 들어 있었고, 상자마다 숫자가 적혀 있었습니다. 
알리바바는 주문 번호 k(k<N)를 암송하고, k개의 연속된 보물상자 번호의 합 중 최대값을 구하여 최대값을 출력한다.
설명을 입력하십시오. 
  첫 번째 줄에 숫자 문자열을 입력하십시오. 숫자를 구분하려면 쉼표를 사용하십시오. 예: 2,10,-3,-8,40,5. 
  두 번째 줄에 철자 번호를 입력하십시오. 예: 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