news 2026/5/6 14:57:48

洛谷官方题单[Java版题解]--【入门4】数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷官方题单[Java版题解]--【入门4】数组

知识点:滑动窗口:

想象你在一排店铺,要统计连续5家店的总营业额

  • 滑动窗口:第一家算好,下一家 = 上一家 - 出窗口的 + 进窗口的

  • 像一个窗口本身一样去滑动,只去更新变化的

  • 就是你以后学习一旦有疑问,就是觉得自己可能想不清楚的,一定要先去问清楚,问人,问AI
    这里是假如你要把下标为i的加入,那么自然你要把第i-m的元素去掉,然后第一个加入i的下标应该是第m个,去掉的第一个下标是i-m个(i=m),

滑动窗口 = 不重复造轮子,只更新变化的

import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); //你不用去写min=9999999,直接去写 int max=integer.max_value; // int max=Integer.MAX_VALUE; int sum=0; ArrayList<Integer>list=new ArrayList<>(); for (int i=0;i<n;i++){ list.add(sc.nextInt()); } //这道题主要考察的是:滑动窗口 //比如计算1-n数字中的三个数字和,可以先像窗口一样先计算前三个的和,然后往右边去滑动,减去第一个,加上最后一个,以次去循环 //先计算前m个的和,然后也要参与比较 for(int i=0;i<m;i++){ sum+=list.get(i); } int min=sum; //就是你以后学习一旦有疑问,就是觉得自己可能想不清楚的,一定要先去问清楚 //这里是假如你要把下标为i的加入,那么自然你要把第i-m的元素去掉,然后第一个加入的下标 //应该是第m个,去掉的第一个下标是m-m个 for(int i=m;i<n;i++){ sum=sum-list.get(i-m)+list.get(i); if(sum<min){ min=sum; } } System.out.println(min); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n= sc.nextInt(); int m= sc.nextInt(); int sum=0; int []arr=new int[n]; for (int i = 0; i < arr.length; i++) { arr[i]=sc.nextInt(); } //把下标为i的元素,加入,那么必然要去去掉第i-m的元素 //然后你要去加入的第一个元素,下标应该是第m个(i=m),去掉的应该是第m-m个 for(int i=0;i<m;i++){ sum+=arr[i]; } //这里是把第一个窗口的值被赋予 min ,然后拿第二个窗口和它比,比它小,min就是第二个窗口,以从类推 int min=sum; for(int i=m;i<n;i++){ sum=sum-arr[i-m]+arr[i]; if(sum<min){ min=sum; } } System.out.println(min); } }

import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { int count=0; boolean []b=new boolean[2000005];//数组开大点防止越界 Scanner sc=new Scanner(System.in); ArrayList<Double>list=new ArrayList<>(); ArrayList<Integer>list2=new ArrayList<>(); int n= sc.nextInt(); for(int i=0;i<n;i++){ list.add(sc.nextDouble()); list2.add(sc.nextInt()); } for (int i=0;i<n;i++){ for (int j=1;j<=list2.get(i);j++){ //其实这里的向下去整可以直接(int)(3.6),自动转化为3 int a=(int)Math.floor(list.get(i)*(j*1.0)); b[a]=!b[a]; } } for(int i=1;i<b.length;i++){ if(b[i]==true){ System.out.println(i); break; } } } }

知识点:如何一次性输入若干个数据,你也不知道数据有多少

import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); //这道题的一个难点,就是我要去存入若干个数的时候,我具体不知道,我要去存入好多 //但我去学习了一个好方法,去解决我的问题 //就是先去读入一整行,然后遇到," "我就把他分割,把分割的数据,当成一个字符数组存起来 //最后我在把字符数组,转化int数组去存起来 String s = sc.nextLine(); String[] s1 = s.split(" "); ArrayList<Integer> list = new ArrayList<>(); StringBuilder sb = new StringBuilder(); int current=0; for (String s2 : s1) { list.add(Integer.parseInt(s2)); } int count=0; //这里他是对先去打上标记数字,相减为0就输出0,否则就是1 for (int i = 1; i < list.size(); i++) { for (int cnt = 0; cnt < list.get(i); cnt++) { sb.append(current); } current=1-current; } //遍历 String s2 = sb.toString(); for (int i = 0; i < s2.length(); i++) { char c=s2.charAt(i); System.out.print(c); count++; if(count%list.get(0)==0){ System.out.println(); } } } }

知识点与难点:1.如何一次性输入若干个多个不同行的数,你也不知道具体多少个数,与统计字符串数字

import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { String res=""; Scanner sc = new Scanner(System.in); ArrayList<String> s = new ArrayList<>(); ArrayList<Integer>ans=new ArrayList<>(); //这道题的难点一:,就是如何去读去若干行的数据,就是你也不知道,有多少行的数据 //我们可以去使用hasNextLine():判断是否有下一行和nextLine()读取当前行的数据(不包括换行) //然后在idea中你要手动输入ctrl+Z+D,它才会去结束,但在OJ平台它会自动去输入Ctrl+Z+D结束 while(sc.hasNextLine()){ String s1 = sc.nextLine(); s.add(s1); } int N=s.size(); for (String s1 : s) { res += s1; } char a=' '; //第二个难点对于我而言就是去统计字符串,相当于就是遇到不同就直接去换 int cnt1=0; a= res.charAt(0);ans.add(N); //第三个难点是要严格按照题目要求来,假如我第一个数字为1,就要先去存入0 if(a=='1'){ ans.add(0); } for (int i = 0; i < res.length(); i++) {//00011000 //先去读去第一个字符 if(res.charAt(i)==a){ cnt1++; } else{ ans.add(cnt1); a=res.charAt(i); cnt1=1; } } ans.add(cnt1); for (Integer an : ans) { System.out.print(an+" "); } } }

知识点:利用boolean数组去去重:

import java.util.ArrayList; import java.util.Scanner; public class Main { static ArrayList<Integer>list=new ArrayList<>(); static int count=0; static boolean []b=new boolean[10005]; public static void main(String[] args) { Scanner sc= new Scanner(System.in); int n=sc.nextInt(); for (int i = 0; i < n; i++) { list.add(sc.nextInt()); } for (int i = 0; i < list.size(); i++) { for (int i1 = i+1; i1 < list.size(); i1++) { int a=list.get(i)+list.get(i1); is(a); } } for (int i = 0; i < b.length; i++) { if(b[i]){ count++; } } System.out.println(count); } //静态访问静态 public static void is(int i){ for (int i1 = 0; i1 < list.size(); i1++) { //这里我是去利用boolean[]打标记,然后去去重 if(i==list.get(i1)){ b[i]=true; } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 14:54:29

通过 TaoToken CLI 快速为团队项目配置统一 API 密钥

通过 TaoToken CLI 快速为团队项目配置统一 API 密钥 1. 安装 TaoToken CLI 工具 TaoToken CLI 提供两种安装方式&#xff0c;适合不同使用场景。对于临时性需求&#xff0c;可以直接通过 npx 运行&#xff0c;无需全局安装&#xff1a; npx taotoken/taotoken若团队需要频繁…

作者头像 李华
网站建设 2026/5/6 14:52:28

在 Simulink 中实现一个具备“自适应”能力的智能电机驱动器

目录 🎯 一、 核心目标与系统架构 系统整体架构图 🛠️ 二、 手把手建模步骤 第一步:搭建被控对象 (The Plant) 第二步:定义强化学习环境 (Define Environment) 第三步:选择并配置智能体 (Select Agent) 第四步:训练智能体 (Training) 第五步:部署与验证 (Dep…

作者头像 李华
网站建设 2026/5/6 14:52:28

告别臃肿图片:用Docker Compose给MinIO快速挂载ImgProxy,附Java签名生成代码

轻量级图片处理方案&#xff1a;MinIO与ImgProxy的高效集成实践 在当今以内容为主导的互联网应用中&#xff0c;图片处理已成为开发者无法回避的技术挑战。无论是电商平台的商品展示、社交媒体的用户上传&#xff0c;还是新闻网站的图文混排&#xff0c;未经优化的图片往往会成…

作者头像 李华