• 【PAT乙】2022秋季赛后总结


    目录

    ✨前言

    👉🏻历史回顾👈🏻

     ✏️真题回忆

    🎈第一题

    🎈第二题

    🎈第三题

    🎈第四题

    🎈第五题

    📖总结与分享

    PAT乙110题专栏:PAT乙(JAVA题解)

    ✨前言

           这个暑假博主利用见习和闲暇的时间刷完了PAT乙级的110道题目,首先来说说我的感受吧,题目呢不是很难涉及到的知识点呢也不多,像一些常见的HashMap数组自定义类大数排序双指针重写CompareTo方法都是常考点,乙级也没有涉及什么复杂的数据结构,最多也就考考链表,真题呢博主做了今年的春季夏季赛,感觉春季难度和这次的秋季难度差不多,夏季赛应该算是最难的了,其中最后一道手撸操作系统中的LRU缓存算法,实属是把我看懵逼了,好在这次秋季赛难度一般,做起来感觉还是比较顺利的!

    👉🏻历史回顾👈🏻

     ✏️真题回忆

    因为题目忘记复制和截图了,下面仅凭博主残缺的记忆以及IDEA里的题解代码,来写下述的总结,敬请谅解!!

    🎈第一题

    1. package PAT乙2022秋季;
    2. import java.io.*;
    3. /**
    4. * @author yx
    5. * @date 2022-09-04 13:25
    6. */
    7. public class NO1 {
    8. static PrintWriter out=new PrintWriter(System.out);
    9. static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    10. static StreamTokenizer in=new StreamTokenizer(ins);
    11. public static void main(String[] args) throws IOException {
    12. in.nextToken();int a0=(int) in.nval;
    13. in.nextToken();int n=(int) in.nval;
    14. for (int i = 0; i < n; i++) {
    15. a0=sum_i(a0*a0*a0+1);
    16. }
    17. System.out.println(a0);
    18. }
    19. static int sum_i(int n){
    20. int sum=0;
    21. while (n!=0){
    22. sum+=n%10;
    23. n=n/10;
    24. }
    25. return sum;
    26. }
    27. }

    第一题非常基础,求每个数字的各个位数上的数字之后,然后以数列的形式展现,直接一个迭代就完事儿了。

    🎈第二题

    1. package PAT乙2022秋季;
    2. import java.io.*;
    3. import java.util.ArrayList;
    4. import java.util.HashSet;
    5. /**
    6. * @author yx
    7. * @date 2022-09-04 13:32
    8. */
    9. public class NO2 {
    10. static PrintWriter out=new PrintWriter(System.out);
    11. static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    12. static StreamTokenizer in=new StreamTokenizer(ins);
    13. public static void main(String[] args) throws IOException {
    14. in.nextToken();int m=(int) in.nval;
    15. in.nextToken();int k=(int) in.nval;
    16. String[] split=ins.readLine().split("");
    17. HashSet set=new HashSet<>();
    18. int n=0;
    19. int ans=0;
    20. for (int i = 0; i < m; i++) {
    21. if(split[i].equals("A")){
    22. n=bHua_A(n);
    23. set.add(n);
    24. }else {
    25. n=bHua_B(n);
    26. set.add(n);
    27. }
    28. // System.out.println(n);
    29. }
    30. ArrayList list=new ArrayList<>(set);
    31. for (int i = 0; i < list.size(); i++) {
    32. if(list.get(i)<=k){
    33. ans++;
    34. // System.out.print(list.get(i)+" ");
    35. }
    36. }
    37. System.out.println(ans);
    38. }
    39. static int bHua_A(int n){
    40. return n/4;
    41. }
    42. static int bHua_B(int n){
    43. return (8*n+1);
    44. }
    45. }

    第二题是一个字符串+数组的题目吧,大概的意思是给你一串字符,分别由A和B组成,然后遍历,当字符串,当字符为A时对应的A操作,当字符为B时对应的B操作,最后将每次操作过后的数字存进set中,最后统计这些数字中小于k的个数!

    🎈第三题

    1. package PAT乙2022秋季;
    2. import com.sun.deploy.util.SyncAccess;
    3. import com.sun.xml.internal.bind.v2.runtime.reflect.Lister;
    4. import java.io.*;
    5. import java.util.ArrayList;
    6. import java.util.HashMap;
    7. /**
    8. * @author yx
    9. * @date 2022-09-04 13:54
    10. */
    11. public class NO3 {
    12. static PrintWriter out=new PrintWriter(System.out);
    13. static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    14. static StreamTokenizer in=new StreamTokenizer(ins);
    15. public static void main(String[] args) throws IOException {
    16. in.nextToken();int N=(int) in.nval;
    17. in.nextToken();int a=(int) in.nval;
    18. in.nextToken();int b=(int) in.nval;
    19. int max_fwn=0;
    20. int max_fww=0;
    21. int min_fww=100000000;
    22. boolean flag=false;
    23. int count=0;
    24. HashMap> map=new HashMap<>();
    25. ArrayList list=new ArrayList<>();
    26. for (int i = 0; i < N; i++) {
    27. String[] split=ins.readLine().split(" ");
    28. int temp=Integer.parseInt(split[1]);
    29. if(temp>=a && temp<=b ){
    30. flag=true;
    31. count++;
    32. if(!map.containsKey(temp)) {
    33. ArrayList list1=new ArrayList<>();
    34. list1.add(split[0]);
    35. map.put(temp, list1);
    36. }else {
    37. map.get(temp).add(split[0]);
    38. }
    39. if(temp>max_fwn){
    40. max_fwn=temp;
    41. }
    42. }else {
    43. if(temp>max_fww){
    44. max_fww=temp;
    45. }
    46. if(temp
    47. min_fww=temp;
    48. }
    49. }
    50. }
    51. if(flag){
    52. out.println(count+" "+max_fwn);
    53. for (int i : map.keySet()) {
    54. if(i==max_fwn){
    55. int length=map.get(i).size();
    56. ArrayList list2=map.get(i);
    57. for (int j = 0; j < length; j++) {
    58. out.println(list2.get(j));
    59. }
    60. }
    61. }
    62. }else {
    63. out.println(min_fww+" "+max_fww);
    64. }
    65. out.flush();
    66. }
    67. }

    第三题是一个买月饼的题,类似于Basic Level中的第100道题:1100 校庆,多组数据处理,也是一道很常规的题目,很遗憾的是超时了,最后我想着用自定义类去做,发现还是超时两个点,一看限制时间:200ms,秒懂,直接放弃,Java选手的悲哀!!!

    🎈第四题

    1. package PAT乙2022秋季;
    2. import java.io.*;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.HashMap;
    6. /**
    7. * @author yx
    8. * @date 2022-09-04 14:26
    9. */
    10. public class NO4 {
    11. static PrintWriter out=new PrintWriter(System.out);
    12. static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    13. static StreamTokenizer in=new StreamTokenizer(ins);
    14. public static void main(String[] args) throws IOException {
    15. in.nextToken();int n=(int) in.nval;
    16. in.nextToken();int h=(int) in.nval;
    17. // HashMap map=new HashMap<>();
    18. ArrayList list=new ArrayList<>();
    19. int max_numbers=0;
    20. int x_=0;
    21. int duoYu=0;
    22. //读入数据
    23. for (int i = 0; i < n; i++) {
    24. in.nextToken();int temp=(int) in.nval;
    25. list.add(temp);
    26. }
    27. for (int i = 0; i < n ; i++) {
    28. int temp1=list.get(i);
    29. for (int j = i; j < n; j++) {
    30. int temp2=list.get(j);
    31. if(temp1+h>=temp2){
    32. if(j-i+1>max_numbers){
    33. max_numbers=j-i+1;
    34. x_=temp1;
    35. duoYu=temp1+h-temp2;
    36. }
    37. }
    38. }
    39. }
    40. out.println((x_-duoYu)+" "+max_numbers);
    41. out.flush();
    42. }
    43. }

    第四题有点滑动窗口的意思,其实也就是一个区间问题,在110题中也有出现,具体是哪一个题目我有点忘记了,这种题LeetCode上也碰到过很多次,题目不难,但还是超时了两个点,没拿到满分,原因不言而喻限时:200ms,Java选手再一次自觉的选择了pass!

    🎈第五题

    1. package PAT乙2022秋季;
    2. import java.io.*;
    3. import java.util.Arrays;
    4. /**
    5. * @author yx
    6. * @date 2022-09-04 14:52
    7. */
    8. public class NO5 {
    9. static PrintWriter out=new PrintWriter(System.out);
    10. static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    11. static StreamTokenizer in=new StreamTokenizer(ins);
    12. public static void main(String[] args) throws IOException {
    13. in.nextToken();int n=(int) in.nval;
    14. boolean isTrue=false;
    15. for (int i = 0; i < n; i++) {
    16. in.nextToken();
    17. int m = (int) in.nval;
    18. int[] nums = new int[m];
    19. int flag = 0;
    20. for (int j = 0; j < m; j++) {
    21. in.nextToken();
    22. nums[j] = (int) in.nval;
    23. }
    24. int[] temp = Arrays.copyOf(nums, m);
    25. Arrays.sort(temp);
    26. for (int j = 1; j < m - 1; j++) {
    27. isTrue = false;
    28. if (temp[0] == nums[0] && temp[m - 1] == nums[m - 1]) {
    29. System.out.println("Yes");
    30. isTrue = true;
    31. break;
    32. }
    33. if (temp[j] == nums[j] && nums[j]>=temp[j-1] && nums[j]<=temp[j+1]) {
    34. if (temp[0] == nums[0] && temp[m - 1] != nums[m - 1]) {
    35. System.out.println("Yes");
    36. isTrue = true;
    37. break;
    38. }
    39. if (temp[0] != nums[0] && temp[m - 1] == nums[m - 1]) {
    40. System.out.println("Yes");
    41. isTrue = true;
    42. break;
    43. }
    44. flag++;
    45. }
    46. }
    47. if (!isTrue) {
    48. if (flag == 3) {
    49. System.out.println("Yes");
    50. } else {
    51. System.out.println("No");
    52. }
    53. }
    54. }
    55. }
    56. }

    最后一题是一道快速排序的题目,类似于Basic Level的第35题PTA,但是很遗憾,这道题目我有两个点没拿到,看了一会还是找不出原因,于是就准备交卷跑路了,后续坐等满分大神出题解!

    📖总结与分享

        Java真的不适合写算法(至少不适合PAT),虽然它有很多非常香的API可以用,但是真的太慢了,因为底层有一个Java虚拟机,即使我已经使用IO流去接收数据了,但在PAT上面只要有限时200ms以下的题目必超时两个点,Java选手的的悲哀莫过于此,这次秋季赛就栽了,第三题和第四题都超时两个点(因为超时多扣了10分,祭!!),本来还想优化一下,一看限时200ms,秒懂,直接提前交卷,下图Basic Level只拿到了2095分,剩下的105分都是Java的超时导致的!

    后续等数学建模国赛结束,准备甲级,感兴趣的小伙伴可以关注博主😘

  • 相关阅读:
    ARP欺骗
    MySQL数据库—创建数据库与数据表
    SpringBoot获取树状结构数据
    征服BAT精选《Spring 源码分析》核心,欢迎围观
    半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!
    css控制卡片内部的左右布局
    数据结构——二叉搜索树的实现、删除(最大值和最小值、最大值和最小值)
    两万字盘点被玩烂了的9种设计模式
    53 windows_server_2012_R2
    Redis缓存击穿、雪崩、穿透
  • 原文地址:https://blog.csdn.net/m0_55858611/article/details/126695422