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. 读取输入 :从标准输入读取 Nx,以及 N 个正整数。
  2. 初始化变量 :定义两个指针 leftright,都指向数组的起始位置。同时初始化一个变量 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);
    }
}
相关推荐
程序员buddha1 小时前
用Maven定位和解决依赖冲突
java·maven
studyer_domi1 小时前
Matlab 分数阶PID控制
开发语言·matlab
液态不合群1 小时前
rust程序静态编译的两种方法总结
开发语言·后端·rust
努力的搬砖人.1 小时前
maven如何搭建自己的私服(LINUX版)?
java·linux·maven
zfj3211 小时前
用java实现一个简单的sql select 解析器,无需第三方依赖,完全从0开始
java·sql
学地理的小胖砸2 小时前
【Python 日期和时间】
开发语言·python
想成为大佬的每一天2 小时前
Linux网络编程day7 线程池and UDP
linux·开发语言
bingbingyihao2 小时前
SpringBoot教程(vuepress版)
java·spring boot·后端
喝养乐多长不高2 小时前
数据结构--红黑树
java·数据结构·算法·红黑树·二叉搜索树·avl树