洛谷官方题单[Java版题解]--【入门4】数组
知识点:滑动窗口:想象你在一排店铺要统计连续5家店的总营业额滑动窗口第一家算好下一家 上一家 - 出窗口的 进窗口的像一个窗口本身一样去滑动,只去更新变化的就是你以后学习一旦有疑问,就是觉得自己可能想不清楚的,一定要先去问清楚,问人,问AI这里是假如你要把下标为i的加入,那么自然你要把第i-m的元素去掉,然后第一个加入i的下标应该是第m个,去掉的第一个下标是i-m个(im),滑动窗口 不重复造轮子只更新变化的import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scnew Scanner(System.in); int nsc.nextInt(); int msc.nextInt(); //你不用去写min9999999,直接去写 int maxinteger.max_value; // int maxInteger.MAX_VALUE; int sum0; ArrayListIntegerlistnew ArrayList(); for (int i0;in;i){ list.add(sc.nextInt()); } //这道题主要考察的是:滑动窗口 //比如计算1-n数字中的三个数字和,可以先像窗口一样先计算前三个的和,然后往右边去滑动,减去第一个,加上最后一个,以次去循环 //先计算前m个的和,然后也要参与比较 for(int i0;im;i){ sumlist.get(i); } int minsum; //就是你以后学习一旦有疑问,就是觉得自己可能想不清楚的,一定要先去问清楚 //这里是假如你要把下标为i的加入,那么自然你要把第i-m的元素去掉,然后第一个加入的下标 //应该是第m个,去掉的第一个下标是m-m个 for(int im;in;i){ sumsum-list.get(i-m)list.get(i); if(summin){ minsum; } } 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 sum0; int []arrnew int[n]; for (int i 0; i arr.length; i) { arr[i]sc.nextInt(); } //把下标为i的元素,加入,那么必然要去去掉第i-m的元素 //然后你要去加入的第一个元素,下标应该是第m个(im),去掉的应该是第m-m个 for(int i0;im;i){ sumarr[i]; } //这里是把第一个窗口的值被赋予 min ,然后拿第二个窗口和它比,比它小,min就是第二个窗口,以从类推 int minsum; for(int im;in;i){ sumsum-arr[i-m]arr[i]; if(summin){ minsum; } } System.out.println(min); } }import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { int count0; boolean []bnew boolean[2000005];//数组开大点防止越界 Scanner scnew Scanner(System.in); ArrayListDoublelistnew ArrayList(); ArrayListIntegerlist2new ArrayList(); int n sc.nextInt(); for(int i0;in;i){ list.add(sc.nextDouble()); list2.add(sc.nextInt()); } for (int i0;in;i){ for (int j1;jlist2.get(i);j){ //其实这里的向下去整可以直接(int)(3.6),自动转化为3 int a(int)Math.floor(list.get(i)*(j*1.0)); b[a]!b[a]; } } for(int i1;ib.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 scnew Scanner(System.in); //这道题的一个难点,就是我要去存入若干个数的时候,我具体不知道,我要去存入好多 //但我去学习了一个好方法,去解决我的问题 //就是先去读入一整行,然后遇到, 我就把他分割,把分割的数据,当成一个字符数组存起来 //最后我在把字符数组,转化int数组去存起来 String s sc.nextLine(); String[] s1 s.split( ); ArrayListInteger list new ArrayList(); StringBuilder sb new StringBuilder(); int current0; for (String s2 : s1) { list.add(Integer.parseInt(s2)); } int count0; //这里他是对先去打上标记数字,相减为0就输出0,否则就是1 for (int i 1; i list.size(); i) { for (int cnt 0; cnt list.get(i); cnt) { sb.append(current); } current1-current; } //遍历 String s2 sb.toString(); for (int i 0; i s2.length(); i) { char cs2.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); ArrayListString s new ArrayList(); ArrayListIntegeransnew ArrayList(); //这道题的难点一:,就是如何去读去若干行的数据,就是你也不知道,有多少行的数据 //我们可以去使用hasNextLine():判断是否有下一行和nextLine()读取当前行的数据(不包括换行) //然后在idea中你要手动输入ctrlZD,它才会去结束,但在OJ平台它会自动去输入CtrlZD结束 while(sc.hasNextLine()){ String s1 sc.nextLine(); s.add(s1); } int Ns.size(); for (String s1 : s) { res s1; } char a ; //第二个难点对于我而言就是去统计字符串,相当于就是遇到不同就直接去换 int cnt10; a res.charAt(0);ans.add(N); //第三个难点是要严格按照题目要求来,假如我第一个数字为1,就要先去存入0 if(a1){ ans.add(0); } for (int i 0; i res.length(); i) {//00011000 //先去读去第一个字符 if(res.charAt(i)a){ cnt1; } else{ ans.add(cnt1); ares.charAt(i); cnt11; } } ans.add(cnt1); for (Integer an : ans) { System.out.print(an ); } } }知识点:利用boolean数组去去重:import java.util.ArrayList; import java.util.Scanner; public class Main { static ArrayListIntegerlistnew ArrayList(); static int count0; static boolean []bnew boolean[10005]; public static void main(String[] args) { Scanner sc new Scanner(System.in); int nsc.nextInt(); for (int i 0; i n; i) { list.add(sc.nextInt()); } for (int i 0; i list.size(); i) { for (int i1 i1; i1 list.size(); i1) { int alist.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(ilist.get(i1)){ b[i]true; } } } }