【华为OD题库-084】最长连续子序列-Java

news/2024/7/20 19:49:32 标签: 华为od, java

题目

有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度。如果没有满足要求的序列,返回-1。
输入描述
第一行输入是:N个正整数组成的一个序列
第二行输入是:给定整数sum
输出描述
最长的连续子序列的长度
备注
输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔。序列长度:1<=N<= 200
输入序列不考虑异常情况
示例1:
输入
1,2,3,4,2
6
输出
3
说明
1,2,3和4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3.
示例2:
输入
1,2,3,4,2
20
输出
-1
说明
没有满足要求的子序列,返回-1

思路

滑动窗口法,以示例数据为例:1 2 3 4 2,目标和targetSum为6
记i为窗口左边界,j为窗口右边界,输入的数组为nums,初始和为curSum=nums[0]
如果curSum<targetSum,那么将j右移动,并更新当前curSum+=nums[++j],先右移再更新,可能越界
如果curSum==targetSum,那么记录此时窗口的长度:j-i+1
如果curSum>targetSum,那么i右移,并更新当前curSum-=nums[i–],先更新再右移,不会越界
最后考虑窗口保证有效,i,j不得超过nums范围,循环条件注意加上:i<=j,否则:1 2 3 4 2,目标和为0,无法通过。

题解

java">package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class TheLongestContinueSubStr {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
        int sum = sc.nextInt();
        System.out.println(theLongestContinueSubStr(nums, sum));
    }

    private static int theLongestContinueSubStr(int[] nums, int sum) {
        int i = 0, j = 0, res = -1;
        int curSum = nums[0];
        while (i <= j && i < nums.length && j < nums.length) {
            if (curSum < sum) {
                j++;
                if (j < nums.length) curSum += nums[j];
            } else if (curSum >= sum) {
                if (curSum == sum) res = Math.max(res, j - i + 1);
                curSum -= nums[i];
                i++;
            }
        }
        return res;

    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5244820.html

相关文章

fijkplayer flutter 直播流播放

fijkplayer flutter 直播流播放 fijkplayer 是 ijkplayer 的 Flutter 封装&#xff0c; 是一款支持 android 和 iOS 的 Flutter 媒体播放器插件&#xff0c; 由 ijkplayer 底层驱动。 通过纹理&#xff08;Texture&#xff09;接入播放器视频渲染到 Flutter 中。 前言 目前使用…

JS中深拷贝与浅拷贝

定义 深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是在编程中常用的两种对象复制方式。 浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 浅拷贝是创建一个新的对象&#xff0c;将原始对象的属性值复制到新对象中。如果属…

3-二分-索引二分-搜索插入位置

这是索引二分的第三篇算法&#xff0c;比较简单&#xff0c;缓一缓。力扣链接 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) …

DS1307时钟模块使用记录

在网上买的一个模块&#xff0c;准备做外部的一个时钟&#xff0c;接入自己其他的项目中&#xff0c;以它的时间为基准&#xff0c;执行每半小时更新时间到其他产品中去 模块采用软件IIC方式读写&#xff0c;需给此模块VCC供5V电压 读写效果如下&#xff1a; 源代码&#xff1…

【Java 基础】21 多线程同步与锁

文章目录 1.存在的问题2.使用同步解决问题1) synchronized2) volatile3) 锁 总结 用多线程过程中&#xff0c;有可能出现 多个线程同时处理&#xff08;获取或修改等&#xff09;同一个数据&#xff0c;这个时候就 会发生数据不同步的问题&#xff0c; 因此出现了同步和锁来…

KVM+GFS分布式存储系统构建KVM高可用

一、安装部署KVM虚拟化平台 1、安装KVM虚拟化平台 yum -y install qemu-kvm qemu-kvm-tools virt-install qemu-img bridge-utils libvirt virt-manager 2、验证 cat /proc/cpuinfo | grep vmx lsmod | grep kvm 3、开启libvirtd服务 systemctl start libvirtd && syst…

L1-009:N个数求和

目录 ⭐题目描述⭐ ⭐分析 ⭐程序代码 运行结果 ⭐文案分享⭐ ⭐题目描述⭐ 本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行给出…

Amazon CodeWhisperer 正式发布可免费供个人使用

文章作者&#xff1a;sunny 亚马逊云科技日前推出了实时 AI 编程助手 Amazon CodeWhisperer&#xff0c;包括个人套餐和专业套餐&#xff0c;所有开发人员均可免费使用个人套餐。Amazon CodeWhisperer 让开发人员能够保持专注、高效&#xff0c;帮助他们快速、安全地编写代码&a…