最长连续子序列 - 华为OD统一考试(E卷)

OD统一考试(E卷)

分值: 100分

题解: Java / Python / C++

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

有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。

题解

这个题目属于“滑动窗口”或“双指针”类型的题目,目的是在一个整数数组中找到和等于给定整数 sum 的连续子序列,并返回此子序列的最大长度。如果没有满足要求的序列,返回 -1。

解题思路

  1. 滑动窗口:我们可以使用两个指针(或称作滑动窗口的左右边界),用一个窗口表示当前的子序列。我们逐渐向右移动右边界来扩大窗口,当窗口内的和超过 sum 时,我们移动左边界来缩小窗口。当窗口内的和刚好等于 sum 时,记录窗口的长度,并与当前最长的长度比较。
  2. 步骤
    • 初始化两个指针 leftright,表示窗口的左右边界,left 从序列开始,right 开始遍历序列。
    • 使用一个变量 current_sum 记录当前窗口的元素和。
    • 如果 current_sum 大于 sum,则需要收缩左边界(移动 left),直到 current_sum 小于等于 sum
    • 如果 current_sum 等于 sum,更新最长子序列的长度。
    • 重复这个过程直到 right 遍历完序列。
  3. 时间复杂度:由于每个元素最多会被访问两次(一次作为右边界,一次作为左边界),所以时间复杂度为 O(N),其中 N 是数组的长度。

Java

import java.util.Arrays;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static int longestSubsequenceWithSum(int[] nums, int targetSum) {int n = nums.length;int left = 0, currentSum = 0, maxLength = -1;for (int right = 0; right < n; right++) {currentSum += nums[right];// 当当前窗口的和大于目标值时,缩小窗口while (currentSum > targetSum) {currentSum -= nums[left];left++;}// 如果当前窗口的和等于目标值,更新最大长度if (currentSum == targetSum) {maxLength = Math.max(maxLength, right - left + 1);}}return maxLength;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 输入处理int[] nums = Arrays.stream(scanner.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int targetSum = scanner.nextInt();// 输出结果int result = longestSubsequenceWithSum(nums, targetSum);System.out.println(result);}
}

Python

def longest_subsequence_with_sum(nums, target_sum):n = len(nums)left = 0current_sum = 0max_length = -1for right in range(n):current_sum += nums[right]# 如果当前窗口的和大于目标值,则收缩窗口while current_sum > target_sum:current_sum -= nums[left]left += 1# 如果找到和为目标值的子序列,更新最大长度if current_sum == target_sum:max_length = max(max_length, right - left + 1)return max_length# 输入处理
sequence = input().strip()  # 获取输入的序列
target_sum = int(input().strip())  # 获取目标和
nums = list(map(int, sequence.split(',')))  # 将输入的序列转化为整数列表# 输出结果
result = longest_subsequence_with_sum(nums, target_sum)
print(result)

C++

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;int longestSubsequenceWithSum(const vector<int>& nums, int targetSum) {int n = nums.size();int left = 0, currentSum = 0, maxLength = -1;for (int right = 0; right < n; right++) {currentSum += nums[right];// 当当前窗口的和大于目标值时,缩小窗口while (currentSum > targetSum) {currentSum -= nums[left];left++;}// 如果当前窗口的和等于目标值,更新最大长度if (currentSum == targetSum) {maxLength = max(maxLength, right - left + 1);}}return maxLength;
}int main() {string input;getline(cin, input);// 输入处理stringstream ss(input);string num;vector<int> nums;while (getline(ss, num, ',')) {nums.push_back(stoi(num));}int targetSum;cin >> targetSum;// 输出结果int result = longestSubsequenceWithSum(nums, targetSum);cout << result << endl;return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1538729.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

海报制作哪个软件好?探索5个免费海报生成器

Hey&#xff0c;最近发现了几个超酷的海报生成器&#xff0c;它们简直是设计新手的救星&#xff01;无论是想要快速制作一张吸引眼球的促销海报&#xff0c;还是为即将到来的活动设计一张有创意的邀请函&#xff0c;这些工具都能让整个过程变得既简单又有趣。 设想一下&#x…

React框架搭建,看这一篇就够了,看完你会感谢我

传统搭建框架的方式 在2024年以前&#xff0c;我们构建框架基本上采用官方脚手架&#xff0c;但是官方脚手架其实大概率都不符合我们的项目要求&#xff0c;搭建完了以后往往需要再继续集成一些第三方的包。这时候又会碰到一些版本冲突&#xff0c;配置教程等&#xff0c;往往…

PMP--二模--解题--1-10

文章目录 4.整合管理--商业文件--商业论证&#xff08;是否值得所需投资、高管们决策的依据&#xff09;反映了&#xff1a;1、 [单选] 收到新项目的客户请求之后&#xff0c;项目经理首先应该做什么&#xff1f; 14.敏捷--角色--产品负责人PO–职责–1.创建待办列表并排序;2.确…

大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

k8s的一些命令

kubectl get nodes &#xff1a;查看节点的状态 查看Pod的状态&#xff1a; kubectl get pod --all -namespacesPending,ContainerCreating,ImagePullBackOff都表明Pod没有就绪&#xff0c;Running才是就绪状态 查看Pod的具体情况&#xff1a; kubectl describe pod podnamek…

关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142341544 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Photoshop cc2019安装教程

软件介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是美国Adobe公司旗下最为出名的图像处理软件系列之一&#xff0c;为图像扫描、编辑修改、图像制作、广告创意&#xff0c;图像输入与输出于一体的图形图像处理软件&#xff0c;深受广大平面设计人员和电脑美术爱好…

C++ -命名空间-详解

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C -命名空间-详解 1.C语言缺点之一 -- 命名冲突2.命名空间2.1定义2.2使用访问命名空间中的变量展开命名空间域指定访问命名空间域 2.3其他功能 3.C 标准库中的命名空间指定展开…

ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读

原文链接&#xff1a;https://arxiv.org/abs/2311.16483 代码与数据集&#xff1a;https://tingxueronghua.github.io/ChartLlama/ 本文启发&#xff1a;文章提出利用GPT-4合成大量图表数据&#xff0c;这些数据包含各种图表类型&#xff0c;包含丰富的instruction data。然后…

SpringBootWeb增删改查入门案例

前言 为了快速入门一个SpringBootWeb项目&#xff0c;这里就将基础的增删改查的案例进行总结&#xff0c;作为对SpringBootMybatis的基础用法的一个巩固。 准备工作 需求说明 对员工表进行增删改查操作环境搭建 准备数据表 -- 员工管理(带约束) create table emp (id int …

[产品管理-25]:NPDP新产品开发 - 23 - 产品创新中的市场调研 - 定量市场调研的常见工具

目录 前言&#xff1a; 一、问卷调查 二、消费者测评组 三、概念测试与概念分类 概念测试 概念分类 四、感官检验 1、定义与特点 2、基本方法 3、应用领域 4、优势与局限性 五、眼动追踪 1、技术原理 2、应用领域 3、技术优势 4、市场现状与发展趋势 5、结论 …

创建github的个人主页

创建同名仓库 展示 github star 等信息 https://github.com/anuraghazra/github-readme-stats 添加贪吃蛇 https://github.com/Platane/snk?tabreadme-ov-file 配置好了之后 run workflow 即可

总结拓展十:SAP开发计划(上)

第一节 功能开发说明书介绍 1、功能开发的基础分类 报表查询开发单据打印开发功能开发增强开发接口开发 2、屏幕元素介绍 ——程序屏幕是SAP系统与用户之间的桥梁&#xff0c;屏幕由各种不同元素布局组成 示例&#xff1a;选择屏幕界面 单选输入框 多选输入框 设定默认…

.Net Core 生成管理员权限的应用程序

创建一个ASP.NET Core Web API项目 给解决方案设置一个名称 选择一个目标框架&#xff0c;这里选择的是 .NET 8.0框架 在Porperties文件夹中添加一个app.manifest文件 设置app.manifest文件属性&#xff0c;生成操作设置为嵌入的资源 双击解决方案名称&#xff0c;编辑WebAppli…

FP6296XR-G1 10A电流模式非同步PWM升压转换器芯片IC

一般说明 F1 6296是目前最先进的直流一直流转换器。是一个带有内置15mΩ功率MOSFET使此稳压器具有高功率效率。误差放大器的非逆变输入端连接到1.2V的精密基准电压。电流模式控制和外部补偿网络使系统稳定容易灵活。FP6296采用SOP-8L(EP)封装&#xff0c;可用于应用领域…

使用rust自制操作系统内核

一、系统简介 本操作系统是一个使用rust语言实现&#xff0c;基于32位的x86CPU的分时操作系统。 项目地址&#xff08;求star&#xff09;&#xff1a;GitHub - CaoGaorong/os-in-rust: 使用rust实现一个操作系统内核 详细文档&#xff1a;自制操作系统 语雀 1. 项目特性 …

【ArcGISPro】配置模块

ArcGIS Pro 配置类似于加载项&#xff0c;但提供了扩展应用程序的其他方法。它可以帮助您设计更贴近您组织品牌和工作流的 ArcGIS Pro 版本。 托管配置是比 Add-in 更高级别的自定义。 配置可以提高加载项安全级别并添加非管理员指定的已知文件夹。 配置可以提供比插件更广泛…

如何使用麦肯锡方法做软件需求分析?

使用麦肯锡方法进行软件需求分析&#xff0c;可以借鉴其结构化思维、逻辑严密、以结果为导向的特点&#xff0c;来确保需求分析过程的高效性、准确性和全面性。 一、定义问题与目标 明确项目背景&#xff1a; 了解软件开发的目的、业务场景、用户需求等背景信息。 分析市场趋势…

数据结构——二叉搜索树、Map和Set

对于不同的数据结构&#xff0c;他们的使用场景是不一样的&#xff0c;map和set这两种数据结构主要用在搜索相关的场景中。学习这些之前我们先来了解一下二叉搜索树&#xff0c; 一、搜索树 1.1概念 二叉搜索树 又称 二叉排序树 &#xff0c;它或者是一棵空树&#xff0c;或者…

【Java】线程的同步——synchronized、ReentrantLock

对同一个线程&#xff0c;能否在获取到锁以后继续获取同一个锁? 答案是肯定可以获取同一个锁。因为JVM 允许同一个线程重复获取同一个锁&#xff0c;这种能被同一个线程反复获取的锁&#xff0c;就叫做可重入锁。 一、synchronized同步锁 在 Java中synchronized 同步锁…