目录
华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有N个正整数组成的一个序列,给定一个整数sum,求长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。
二、输入描述
第1行有N个正整数组成的一个序列。
第2行给定一个整数sum。
求最长连续子序列,只要遍历计算连续的子序列和等于更定值就可以了,记录最终最长子序列。
三、输出描述
长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。
四、解题思路
- 读取输入的序列和目标值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作为结果。
五、Java算法源码
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);
}
六、效果展示
1、输入
1,2,3,4,2
2、输出
6
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。