华为OD机试 - 最长连续子序列 - 双指针(Java 2023 B卷 100分)

news2024/11/25 7:11:02

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 备注
    • 四、双指针
      • 1、双指针是什么?
      • 2、Java双指针算法适合解决哪些问题?
    • 五、解题思路
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

二、输入描述

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

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

三、输出描述

最长的连续子序列的长度

备注

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

四、双指针

1、双指针是什么?

双指针算法是一种非常有效的算法策略,常用于解决一些具有线性结构的问题,例如链表和数组。在Java中,我们可以通过使用两个指针(通常命名为 p1 和 p2)来遍历和操作数据结构。

以下是一个使用双指针算法来找到给定数组中是否存在重复元素的简单Java示例:

public class Main {  
    public static void main(String[] args) {  
        int[] arr = {1, 2, 3, 4, 5, 2};  
        System.out.println(containsDuplicate(arr));  
    }  
  
    public static boolean containsDuplicate(int[] nums) {  
        if (nums == null || nums.length < 2) {  
            return false;  
        }  
          
        for (int i = 0; i < nums.length; i++) {  
            for (int j = i + 1; j < nums.length; j++) {  
                if (nums[i] == nums[j]) {  
                    return true;  
                }  
            }  
        }  
        return false;  
    }  
}

在上述代码中,containsDuplicate 函数使用了两个嵌套的循环。外层循环遍历数组的每个元素,内层循环则从当前元素的下一个位置开始遍历数组。如果找到两个相等的元素,函数就返回 true。如果没有找到,就返回 false。

虽然这种方法可以解决问题,但是它的时间复杂度是 O(n^2),在处理大规模数据时可能效率较低。为了提高效率,我们可以使用一个哈希集合来存储已经遍历过的元素,这样我们就可以在 O(n) 的时间复杂度内解决问题。

2、Java双指针算法适合解决哪些问题?

Java双指针算法适用于解决具有线性结构的问题,特别是需要在两个指针所指向的元素之间进行比较和操作的问题。以下是一些可以使用Java双指针算法解决的问题类型:

  1. 数组中是否存在重复元素:使用双指针分别从数组的两端开始,如果两个指针所指向的元素相等,则说明存在重复元素。
  2. 数组中的子数组和:使用双指针分别从数组的两端开始,通过计算两个指针所指向的元素之和,判断是否等于目标值,从而找到所有和为目标值的子数组。
  3. 排序数组中是否存在重复元素:使用双指针分别从排序数组的两端开始,如果两个指针所指向的元素相等且第二个指针仍然在范围内,则说明存在重复元素。
  4. 判断链表中是否存在环:使用双指针分别从链表的两端开始,如果两个指针在某一点相遇,则说明链表中存在环。
  5. 链表排序:使用双指针分别从链表的头部和尾部开始,通过比较节点值的大小决定如何移动指针,最终得到有序的链表。

这些只是Java双指针算法的一些应用示例,实际上,只要问题涉及到线性结构且需要在两个元素之间进行比较和操作,双指针算法都可以提供有效的解决方案。

五、解题思路

  1. 第一行输入若干个数字,逗号隔开;
  2. 第二个输入给定整数sum;
  3. 定义最长的连续子序列长度maxLen,默认-1;
  4. 通过双指针算法找到最长的连续子序列,使他们的和等于sum;
  5. 输出最长的连续子序列长度maxLen。

六、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // N个正整数组成的一个序列
        String input = sc.nextLine();
        // 给定整数sum
        int sum = Integer.parseInt(sc.nextLine());
        List<Integer> list = new ArrayList<>();
        Arrays.stream(input.split(",")).forEach(s -> {
            list.add(Integer.parseInt(s));
        });

        // 双指针算法
        int left = 0;
        int right = 0;
        // 临时的区间和
        int tempSum = list.get(left);

        /**
         * 最长的连续子序列长度
         * 如果没有满足要求的序列,返回-1
         */
        int maxLen = -1;
        while (right < list.size()) {
            if (tempSum < sum) {
                right++;
                if (right == list.size()){
                    break;
                }
                tempSum += list.get(right);
            } else if (tempSum > sum) {
                tempSum -= list.get(left);
                left++;
            } else {
                // 给定整数sum,求长度最长的连续子序列,使他们的和等于sum
                if (maxLen < right - left) {
                    // 返回此子序列的长度
                    maxLen = right - left + 1;
                }
                tempSum -= list.get(left);
                left++;
            }
        }
        System.out.println(maxLen);
    }
}

七、效果展示

1、输入

1,3,5,7,2
9

2、输出

3

3、说明

1,3,5和7,2两个序列均能满足要求,所以最长的连续序列为1,3,5,因此结果为3。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

GUI、多线程编程、网络编程简介

GUI、多线程编程、网络编程简介 文章目录 GUI简介什么是GUIGUI有什么用使用方法 多线程编程什么是多线程编程多线程编程有什么用提高程序的响应能力提高程序的性能实现异步编程并发数据访问和共享资源实现复杂的算法和任务分解 进行多线程编程的步骤 网络编程什么是网络编程网络…

day6 STM32时钟与定时器

STM32时钟系统的概述 概念 时钟系统是由振荡器&#xff08;信号源&#xff09;、定时唤醒器、分频器等组成的电路。 常用的信号有晶体振荡器和RC振荡器。 意义 时钟是嵌入式系统的脉搏&#xff0c;处理器内核在时钟驱动下完成指令执行&#xff0c;状态变换等动作&#xff…

迪瑞克斯拉算法

迪锐克斯拉算法 简单来说就是在有向图中&#xff0c;给定一个图中具体的出发点&#xff0c;从这个点出发能够到达的所有的点&#xff0c;每个点的最短距离是多少。到不了的点&#xff0c;距离则是正无穷。有向&#xff0c;无负权重&#xff0c;可以有环。 所以说&#xff0c;迪…

Linux 终端命令之文件浏览(4) head, tail

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

流量日志分析--实操

[鹤城杯 2021]流量分析 <--第一道流量分析不难,主要就是布尔盲注的流量包分析,直接查看http请求包即可我们可以通过观察看到注入成功的响应长度不同,这里成功的为978字节,失败的994字节.不要问为什么.其实也可以直接判断.978的流量比994的少了非常多 显然就是成功的(因为这里…

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)

前言&#xff1a; 在前面一篇文章云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初始安装&#xff08;一&#xff09;_华为cna_晚风_END的博客-CSDN博客 介绍了基于VMware虚拟机里嵌套部署华为云的云计算&#xff0c;不过仅仅是做到了在VRM的web界面添加计算节点…

高效数据传输:轻松上手将Kafka实时数据接入CnosDB

本篇我们将主要介绍如何在 Ubuntu 22.04.2 LTS 环境下&#xff0c;实现一个KafkaTelegrafCnosDB 同步实时获取流数据并存储的方案。在本次操作中&#xff0c;CnosDB 版本是2.3.0&#xff0c;Kafka 版本是2.5.1&#xff0c;Telegraf 版本是1.27.1 随着越来越多的应用程序架构转…

keil构建STM32工程并使用proteus仿真led点灯实验

STM32单片机与51单片机有很大区别&#xff0c;不仅结构上有很大差异&#xff0c;STM32更复杂一些&#xff0c;在操作上来说&#xff0c;STM32也要复杂很多&#xff0c;51单片机上手写代码&#xff0c;可以很直接操作引脚&#xff0c;但是STM32单片机在操作引脚之前需要作很多初…

学无止境·运维高阶⑤(LVS-DR 群集 配置Nginx负载均衡)

LVS-DR 群集 && 配置Nginx负载均衡 一、LVS-DR 群集1、相关配置环境2、在RS上配置并启动脚本2.1相关脚本2.2 启动脚本&#xff0c;另一台RS同样步骤 3、LVS-DR模式配置脚本4、测试 二、Nginx负载均衡1、安装Nginx并关闭相应设置2、向主机 node2&#xff0c;node3 写入内…

【第二阶段】kotlin函数引用

针对上篇传入函数参数我们也可以重新定义一个函数&#xff0c;然后在main中调用时传入函数对象 lambda属于函数类型的对象&#xff0c;需要把普通函数变成函数类型的对象&#xff08;函数引用&#xff09;&#xff0c;使用“&#xff1a;&#xff1a;” /*** You can edit, ru…

[足式机器人]Part3机构运动微分几何学分析与综合Ch03-1 空间约束曲线与约束曲面微分几何学——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch01-4 平面运动微分几何学 3.1 空间曲线微分几何学概述3.1.1 矢量表示3.1.2 Frenet标架 连杆机构中的连杆与连架杆构成运动副&#xff0c;该运动副元素的特征点或特…

二十二、策略模式

目录 1、项目需求2、传统方案解决鸭子问题的分析和代码实现3、传统方式实现存在的问题分析和解决方案4、策略模式基本介绍5、使用策略模式解决鸭子问题6、策略模式的注意事项和细节7、策略模式的使用场景 以具体项目来演示为什么需要策略模式&#xff0c;策略模式的优点&#x…

GitHub 如何部署写好的H5静态页面

感谢粉皮zu的私信&#xff0c;又有素材写笔记了。(●’◡’●) 刚好记录一下我示例代码的GitHub部署配置&#xff0c;以便于后期追加仓库。 效果 环境 gitwin 步骤 第一步 新建仓库 第二步 拉取代码 将仓库clone到本地 git clone 地址第三步 部署文件 新建.github\workflo…

线性规划模型-应用篇

文章目录 模型特点使用技巧工具包和求解器模型线性化 应用实例经验总结 模型特点 上一篇中&#xff0c;详细阐述了线性规划问题和单纯形法的算法原理&#xff0c;本文将着重介绍线性模型在工业场景中的应用。 首先需要说清楚的是&#xff0c;为什么线性模型深受研发人员青睐。…

五、约束编程求解优化问题

文章目录 1、瑶草问题-离散优化问题2、重试优化3、分支限界法-改进重试优化法4、重启式搜索4.1 重启方针/策略4.2 自动化搜索策略 THE END 1、瑶草问题-离散优化问题 \qquad 要求在一个建木上构建一个完整的分枝树&#xff0c;每一个完整的分枝有100段&#xff0c;完整分枝上的…

2023年《开学第一课》播出时间是什么时候?开学第一课怎么在手机上观看高清直播?

2023年《开学第一课》播出时间是什么时候&#xff1f; 根据往年《开学第一课》播出时间预计2023年《开学第一课》播出时间是2023年9月1日20:00&#xff0c;如有变化请以官方公布为准&#xff1b; 2023年开学第一课怎么在手机上观看高清直播&#xff1f; 1、打开手机微信&…

第三章,矩阵,07-用初等变换求逆矩阵、矩阵的LU分解

第三章&#xff0c;矩阵&#xff0c;07-用初等变换求逆矩阵、矩阵的LU分解 一个基本的方法求 A − 1 B A^{-1}B A−1BLU分解例1&#xff0c;求矩阵A的LU分解&#xff1a;例12&#xff0c;LU分解解线性方程组&#xff1a; 玩转线性代数(19)初等矩阵与初等变换的相关应用的笔记&a…

Rx.NET in Action 第一章学习笔记

Part 1 初入反应式扩展 什么是反应式程序&#xff1f;它们有什么用&#xff1f;使用反应式扩展&#xff08;Rx&#xff09;编程&#xff0c;会如何改变你编写代码的方式&#xff1f;在开始使用 Rx 之前应该做些什么&#xff1f;为什么 Rx 比传统的事件驱动编程更好&#xff1f…

简单认识Zabbix监控系统及配置

文章目录 一、zabbix概述1、定义2、zabbix监控原理3、监控对象4、zabbix的3种架构&#xff08;1&#xff09; C/S架构&#xff08;2&#xff09;分布式架构&#xff1a;zabbix-proxy-client架构&#xff08;3&#xff09; master-node-client架构 5、zabbix监控模式 二、部署za…

Apollo Planning2.0决策规划算法代码详细解析 (1):环境搭建

背景: apollo开源团队近期更新了planning版本,对代码进行了一定程度上的重构。 重构后代码结构更加清晰,对扩展更为友好;此外,也更新了dreamview对pnc的支持,使得调试更加方便。 本教程将继续更新对于Apollo Planning2.0决策规划算法代码的详细解析,便于大家更好理解…