✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
有N个正整数组成的一个序列,给定一个整数sum,求长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。
2. 输入描述
第1行有N个正整数组成的一个序列。
第2行给定一个整数sum。
求最长连续子序列,只要遍历计算连续的子序列和等于更定值就可以了,记录最终最长子序列。
3. 输出描述
长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。
4. Java算法源码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] numsStr = scanner.nextLine().split(",");
int n = scanner.nextInt();
int len = numsStr.length;
int[] nums = new int[len];
for (int i = 0; i < len; i++) {
nums[i] = Integer.parseInt(numsStr[i]);
}
// 子序列最大长度,默认-1
int maxLen = -1;
for (int i = 0; i < len-1; i++) {
int sum = nums[i];
if (sum > n) {
continue;
} else if (sum == n) {
maxLen = Math.max(maxLen, 1);
}
int count = 1;
for (int j = i+1; j < len; j++) {
sum += nums[j];
count++;
if (sum > n) {
break;
} else if (sum == n) {
maxLen = Math.max(maxLen, count);
break;
}
}
}
System.out.println(maxLen);
}
5. 测试
6.解题思路
题目要求找到给定序列中长度最长的连续子序列,使其元素之和等于给定的目标值sum。
算法流程:
- 读取输入的序列和目标值sum。
- 将输入的序列转换为整数数组。
- 初始化最大子序列长度
maxLen
为-1。 - 遍历序列的每个元素,记当前元素索引为i:
- 初始化子序列的和
subSum
为当前元素的值,计数器count
为1。 - 若
subSum
大于目标值sum,则跳过当前元素,继续遍历下一个元素。 - 若
subSum
等于目标值sum,则更新maxLen
为1和maxLen
中的较大值。 - 遍历从i+1到序列末尾的元素,记当前元素索引为j:
- 将当前元素的值加到
subSum
中。 - 将计数器
count
加1。 - 若
subSum
大于目标值sum,则结束当前遍历。 - 若
subSum
等于目标值sum,则更新maxLen
为count
和maxLen
中的较大值,并结束当前遍历。
- 将当前元素的值加到
- 初始化子序列的和
- 输出
maxLen
作为结果。