2025年华为OD上机考试真题(Java)——数组连续和



题目 :

给定一个含有N个正整数的数组,求出有多少个连续区间(包括单个正整数),他们的和大于等于x

输入描述:

bash 复制代码
第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000)

第二行有N个正整数(每个正整数小于等于100)。

输出描述:

bash 复制代码
输出一个整数,表示所求的个数。

示例1

输入:

bash 复制代码
3 7
3 4 7

输出:

bash 复制代码
4

说明:

第一行的3表示第二行数组输入3个数,第一行的7是比较数,用于判断连续数组是否大于该数;组合为 3 + 4; 3 + 4 + 7; 4 + 7; 7; 都大于等于指定的7;所以共四组。

示例2

输入:

bash 复制代码
10 10000
1 2 3 4 5 6 7 8 9 10

输出:

bash 复制代码
0

说明:

所有元素的和小于10000,所以返回0。

解决方案 :

可以使用滑动窗口的方法来解决这个问题。具体步骤如下:

  1. 读取输入 :从标准输入读取 N 和 x,以及 N 个正整数。
  2. 初始化变量 :定义两个指针 left 和 right,都指向数组的起始位置。同时初始化一个变量 sum 来存储当前窗口内元素的和,以及一个计数器 count 用于记录满足条件的区间的数量。
  3. 扩展窗口 :通过移动 right 指针来扩展窗口,直到窗口内的元素和大于或等于给定的 x。
  4. 收缩窗口 :一旦窗口内的和达到了或超过了 x,则开始尝试收缩窗口(即移动 left 指针),并更新计数器 count,直到窗口内的和小于 x。
  5. 重复步骤3和4:继续扩展窗口和收缩窗口的过程,直到遍历完数组。
  6. 返回结果 :最终返回计数器 count 的值作为满足条件的连续区间的数量。

Java代码实现:

java 复制代码
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入
        int N = scanner.nextInt();
        int x = scanner.nextInt();
        int[] nums = new int[N];
        
        for (int i = 0; i < N; i++) {
            nums[i] = scanner.nextInt();
        }

        // 初始化变量
        int left = 0;
        int right = 0;
        int sum = 0;
        int count = 0;

        // 使用滑动窗口方法
        while (right < N) {
            // 扩展窗口
            sum += nums[right];
            right++;

            // 当窗口内的和 >= x 时,尝试收缩窗口
            while (sum >= x && left < right) {
                count += N - right + 1; // 计算以当前left为起点的所有合法子数组
                sum -= nums[left];      // 移除最左边元素
                left++;                 // 收缩窗口
            }
        }

        // 输出结果
        System.out.println(count);
    }
}
相关推荐
qq_4069810321 分钟前
共享变量一 关于extern与const
开发语言·c++
FRing031 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
秋天的怀念_David1 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放1 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261352 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长2 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
字节探索2 小时前
Spring Boot 接口幂等性设计:从唯一索引到 Redis+Lua 的工程实践
java·spring boot
用户3721574261352 小时前
Java 实现 Excel 与 Markdown 相互转换:表格导出、格式设置与多表提取
java
迪菲赫尔曼2 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测