笔试强训 Day 17 :小乐乐改数字、十字爆破、比那名居的桃子

📅 2026/6/30 6:29:02
笔试强训 Day 17 :小乐乐改数字、十字爆破、比那名居的桃子
Day 17小乐乐改数字解题思路使用 Java 内置字符串 api当遍历到的字符是偶数则拼接 ‘0’否则拼接 ‘1’将拼接的字符串转为数字代码实现使用字符串 API 快速转化// 想把每位的数变成0或1// 奇数变成1// 偶数变成0importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerinnewScanner(System.in);intnin.nextInt();StringstrInteger.toString(n);StringBuildersbnewStringBuilder();for(inti0;istr.length();i){intnumstr.charAt(i)-0;if(num%20){sb.append(0);}else{sb.append(1);}}System.out.println(Integer.parseInt(sb.toString()));}}手动处理前导 0importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerinnewScanner(System.in);char[]sin.next().toCharArray();for(inti0;is.length;i){if(s[i]%20)s[i]0;elses[i]1;}// 处理一下前导零inti0;while(is.length-1s[i]0)i;while(is.length){System.out.print(s[i]);}}}处理前导0的思路是先把原数字的每一位转换成0或1偶数位变成0奇数位变成1。例如输入2468会先变成0000如果直接输出就是0000但数字表示里通常不需要前导零所以要跳过开头多余的0。关键代码是while(i s.length - 1 s[i] 0) i;这里用i s.length - 1而不是i s.length是为了至少保留最后一位。比如2468 - 0000如果把所有0都跳过就什么都不输出了这是错误的。正确结果应该是0所以这段逻辑的含义是只要当前字符是0并且它不是最后一个字符就跳过它如果已经到最后一个字符即使它是0也要保留下来输出。再看几个例子1234 - 1010 - 输出 1010 2468 - 0000 - 输出 0 2046 - 0000 - 输出 0 2345 - 0011 - 输出 11总结一句去前导零时不能把所有零删光至少要保留一个字符作为结果。十字爆破解题思路本题卡输入输出使用内存快读先建立二维数组读取输入数字使用两个 long 一维数组计算二维数组每一行每一列的数的和避免 int 溢出打印二维矩阵每个元素为对应 row col - num代码实现// 选择一个方格可以得到和这个方格同行、同列的所有数之和的得分。importjava.util.*;importjava.io.*;publicclassMain{privatestaticPrintWriteroutnewPrintWriter(newBufferedWriter(newOutputStreamWriter(System.out)));privatestaticReadinnewRead();publicstaticvoidmain(String[]args)throwsIOException{intnin.nextInt(),min.nextInt();long[][]numsnewlong[n][m];long[]rownewlong[n];long[]colnewlong[m];for(inti0;in;i){for(intj0;jm;j){nums[i][j]in.nextInt();// 可以用一个 for 循环处理// row[i] arr[i][j];// col[j] arr[i][j];}}for(inti0;in;i){for(intj0;jm;j){row[i]nums[i][j];}}for(intj0;jm;j){for(inti0;in;i){col[j]nums[i][j];}}for(inti0;in;i){for(intj0;jm;j){out.print((row[i]col[j]-nums[i][j]) );}out.println();}out.close();}}classRead{StringTokenizerstnewStringTokenizer();BufferedReaderbfnewBufferedReader(newInputStreamReader(System.in));Stringnext()throwsIOException{if(!st.hasMoreTokens()){Stringlinebf.readLine();if(linenull)returnnull;stnewStringTokenizer(line);}returnst.nextToken();}intnextInt()throwsIOException{returnInteger.parseInt(next());}}比那名居的桃子解题思路滑动窗口先让连续 k 天的快乐值总和最大;如果快乐值相同再让羞耻值总和最小;如果都相同选最早那天;输出的是第几天所以是1下标。另外a[i],b[i] 1e9,n 1e5总和会到 1e14要用 long代码实现// 一只桃子// 吃下桃子后接下来 k 天每天 a[i] 快乐值, b[i] 羞耻值// 哪一天吃下果实可以获得尽可能多的快乐值importjava.util.*;importjava.io.*;publicclassMain{privatestaticPrintWriteroutnewPrintWriter(newBufferedWriter(newOutputStreamWriter(System.out)));privatestaticReadinnewRead();publicstaticvoidmain(String[]args)throwsIOException{intnin.nextInt(),kin.nextInt();long[]anewlong[n];long[]bnewlong[n];for(inti0;in;i)a[i]in.nextInt();for(inti0;in;i)b[i]in.nextInt();intretl0;longsumHappy0,sumShy0;longmaxSumHappyInteger.MIN_VALUE,minSumShyInteger.MAX_VALUE;for(intl0,r0;rn;r){sumHappya[r];sumShyb[r];while(r-l1k){if(sumHappymaxSumHappy||(sumHappymaxSumHappysumShyminSumShy)){retll;maxSumHappysumHappy;minSumShysumShy;}sumHappy-a[l];sumShy-b[l];l;}}out.println(retl1);out.close();}}classRead{StringTokenizerstnewStringTokenizer();BufferedReaderbfnewBufferedReader(newInputStreamReader(System.in));Stringnext()throwsIOException{if(!st.hasMoreTokens()){Stringlinebf.readLine();if(linenull)returnnull;stnewStringTokenizer(line);}returnst.nextToken();}intnextInt()throwsIOException{returnInteger.parseInt(next());}}