华为OD机试之最长连续子序列(Java源码)

最长连续子序列

题目描述

有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度,

如果没有满足要求的序列,返回-1。


输入描述

第一行输入是:N个正整数组成的一个序列

第二行输入是:给定整数sum


输出描述

最长的连续子序列的长度

备注

  • 输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔
  • 序列长度:1 <= N <= 200
  • 输入序列不考虑异常情况

用例

输入

1,2,3,4,2
6

输出 3
说明 1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3。
输入 1,2,3,4,2
20
输出 -1
说明 没有满足要求的子序列,返回-1

题目解析

  1. 使用双指针找到对相邻的数进行求和。若和正确,那么就判断长度是否比前面出现的长度都大,若大就进行记录。
  2. 若和大于,那么就证明该区间内不存在目标序列。左指针右移,临和减掉移出的左侧的那个。
  3. 若和小于,就证明该区间还可以往右扩充,右指针右移,临和加上移入的那一个。这样就避免了在内部在使用循环计算区间和了。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class T53 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		int sum = Integer.parseInt(sc.nextLine());
		List<Integer> numList = new ArrayList<>();
		Arrays.stream(input.split(",")).forEach(s -> {
			numList.add(Integer.parseInt(s));
		});
		int left = 0;
		int right = 0;
		int tempSum = numList.get(left);// 临时的区间和
		int len = -1;
		while (right < numList.size()) {
			if (tempSum < sum) {
				right++;
				if (right == numList.size())
					break;// 超出了
				tempSum += numList.get(right);
				// System.out.println(tempSum);
			} else if (tempSum > sum) {
				tempSum -= numList.get(left);
				left++;
			} else {
				// System.out.println(right - left + "-");
				// System.out.println(right + "-----" + left);
				if (len < right - left) {
					len = right - left + 1;
				}
				tempSum -= numList.get(left);
				left++;

			}
		}
		System.out.println(len);
	}
}


代码运行示意图
华为OD机试之最长连续子序列(Java源码)_第1张图片
华为OD机试之最长连续子序列(Java源码)_第2张图片

你可能感兴趣的:(华为OD机试,华为od,java,算法)