필요:
가난한 나무꾼 알리바바는 장작을 베러 가던 길에 우연히 도적단의 보물창고를 발견했는데, 보물창고에는 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;
}
}
효과: