P4009. 和为K的子数组

该题是这个题的简化版链接

这里有详解

题目内容
给你一个整数数组\(nums\)和一个整数\(k\),请你统计并输出 该数组中和为 \(k\) 的子数组的个数。
子数组是数组中元素的连续非空序列。

输入描述
输入共两行。
第一行为两个个整数 n,k。
第二行为\(n\)个整数\(nums_0,nums_1,...,nums_{n-1}\),数字之间以空格分隔。

输出描述
一个整数,表示答案。

样例1
输入
3 2
1 1 1
输出
2
样例2
输入
3 3
1 2 3
输出
2
提示
\(1 <= nums.length <= 2 * 10^4\)
\(-1000 <= nums[i] <= 1000\)
\(-10^7 <= k <= 10^7\)

这个题其实是一个蓝桥杯的改编题:

package hot100.和为K的子数组;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner= new Scanner(System.in);
        int n=scanner.nextInt();
        int k=scanner.nextInt();
        int[] a=new int[n+1];
        for(int i=1;i<=n;i++){
            a[i]=scanner.nextInt();
        }
        Map<Integer,Integer> mp=new HashMap();
        int sum=0,ans=0;
        mp.put(0,1);
        for(int i=1;i<=n;i++){
            sum=sum+a[i];
            if(mp.containsKey(sum-k)) {
                ans += mp.get(sum-k);
            }
            mp.put(sum, mp.getOrDefault(sum,0) + 1);
        }
        System.out.println(ans);
    }
}


//public class Main {
//    public static void main(String[] args) {
//        Scanner scanner= new Scanner(System.in);
//        int n=scanner.nextInt();
//        int k=scanner.nextInt();
//        int[] a=new int[n+1];
//        for(int i=1;i<=n;i++){
//            a[i]=scanner.nextInt();
//        }
//        Map<Integer,Integer> mp=new HashMap();
//        int sum=0,ans=0;
//        for(int i=1;i<=n;i++){
//            sum=(sum+a[i])%k;
//            if(mp.containsKey(sum)){
//                int tmp=mp.get(sum);
//                ans+=tmp;
//                mp.put(sum,tmp+1);
//            }
//            else{
//                if(sum==0) ans++;
//                mp.put(sum,1);
//            }
//        }
//        System.out.println(ans);
//    }
//}
/*
3 2
1 1 1
输出
2


3 3
1 2 3
输出
2
 */

posted @ 2025-04-15 10:24  lipu123  阅读(9)  评论(0)    收藏  举报