PAT乙级笔记

一、 输入输出

1.Scanner

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int a = in.nextInt();
            int b = in.nextInt();
            System.out.println(a + b);
        }
    }
}

2.BufferedReader

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] in = br.readLine().split(" ");
        int a = Integer.parseInt(in[0]);
        int b = Integer.parseInt(in[1]);
        System.out.println(a+b);
    }
}

3.输出格式化的问题:

① 7766 - 6677 = 1089

想要按上面的格式输出,可以采用下面的代码,免去拼装字符串的麻烦

System.out.printf("%04d - %04d = %04d\n", i, d, number);

注意:当题目中出现四位数字/五位ID这类字眼,我们在输出时要注意控制格式,在输出的数字前面补0

②输出保留两位有效数字的复数

System.out.printf("%.2f%.2fi", integer,model);

③String.format()以及toCharArray()的使用

char[] array = String.format("%04d", number).toCharArray();

④时间相关:

int hour = time / 3600;
int minute = time % 3600 / 60;
int second = time % 60;
System.out.printf("%02d:%02d:%02d\n", hour, minute, second); //12:42:59

⑤四舍五入取整:int line = (int) (row * 0.5 + 0.5); //列数为行数的50%

4.一些输入输出时要考虑的问题:

①极端情况的考虑,如果所有的输入都没达到题目的要求,应该输出什么

②题目没有说第一个数一定比第二个数小,对大小有要求时记得判断

二、 常用函数

判断是否是素数

public static boolean isPrime(int n) {
    if(n < 2) {
        return false;
    } else if(n == 2) {
        return true;
    } else {
        for(int i = 2; i < Math.sqrt(n); i++) {
            if(n % i == 0) {
                return false;
            }
        }
    }
    return true;
}

求最大公约数

private static long GCD(long a,long b) {
    return b == 0 ? a : GCD(b , a % b);
}

三、 常用方法及注意事项

1.巧用数组下标:

1005:检验哪些数计算过,利用数组下标标记计算过的数

1007:素数相关,利用下标对应的数组值来表示一个数是否是素数(从1~N)

1038:按查询指定分数的学生人数,由于分数在0~100,所以可以利用数组下标

1065:ID为5位数字,可以利用数组下标存档couples的信息

2.字符串需要修改/添加时,使用StringBuilder sb = new StringBuilder();

sb.toString()可以将sb转换成字符串(不可逆!)

3.若数字较大,A+B>C可以转换为C-B>A

4. 第10000个素数大约在105000内

5.char的问题,获取’0’到’9’的数字值记得减去’0’;获取单个char的值使用Character.getNumericValue()方法;0~9为48~57,A~Z为65~90,a~z为97~122

6.String的方法:substring()/charAt()/indexOf()

7.Arrays.sort();/Collections.sort();

8. int 数据类型是32位、有符号的以二进制补码表示的整数(10位数字);

最小值是 -2,147,483,648(-2^31);最大值是 2,147,483,647(2^31 - 1);

9. long 数据类型是 64 位、有符号的以二进制补码表示的整数(19位数字);

最小值是 -9,223,372,036,854,775,808(-2^63);

最大值是 9,223,372,036,854,775,807(2^63 -1);

10.正则表达式:

      s.split("[.E]"); -> 匹配"."或"E",在涉及科学计数法的题目中使用

      nums[i].matches("^-?[0-9]*(\\.[0-9]{0,2})?$") -> 匹配保留两位小数的有理数

      s.matches("[0-9]{1,}") // 重点:用matches方法来匹配纯数字

11. RGB颜色用字母表示的,利用toCharArray方法转成char数组来处理

12.现给定字符串,问一共可以形成多少个 PAT,固定一个A,A左边P的数量乘以A右边T的数量就是当前A可以形成的PAT个数,以此类推,统计总的数量

13.String转成int/double/long可以直接用封装类型的转换Integer.parseInt/ Double.parseDouble/ Long.parseLong,获取String可以用valueOf()方法,char转成int要用Character.getNumericValue()方法

14.进制的问题:Integer b = Integer.valueOf("444",16);   // 使用 16 进制

15.关键点要写注释,说明i为1是为了保证“个位为1”这个条件

16.判断退出条件时,记得要写break或continue

17.计算一点周围的八个点,用static int[][]

static int dir[][] = new int[][]{{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};

18.用BufferedReader一直出错时尝试改成Scanner错误可能和换行符的读取有关

19.switch的写法,记一下

switch(ans) {
    case "A":
        res[i] = 1;
        break;
    case "B":
        res[i] = 2;
        break;
    case "C":
        res[i] = 3;
        break;
    case "D":
        res[i] = 4;
        break;
    default:
        break;
}

20.有进位时注意是sum>=10

21.注意in的下标,因为是复制的可能忘了改

四、 25分的题目

1.如果问题所给对象涉及多个数据,且用一维数组/二维数组或map都不容易存储的话,新建一个类,将这些数据存储在对象中。

2.如果最后输出需要对数据进行排序,可以让类

class Cake implements Comparable<Cake>

同时,重写compareTo方法,如下所示

@Override
public int compareTo(Cake c) {
    return this.value > c.value ? -1 : 1;
}

在通过Collections.sort(list);后,list[0]存放的就是value最大的值,即按value递减来排序

@Override
public int compareTo(Student s) {
    if (this.gScore < s.gScore) {
        return 1;
    } else if (this.gScore > s.gScore) {
        return -1;
    } else {
        return this.name.compareTo(s.name);//姓名升序
    }
}

在通过Collections.sort(list);后,list[0]存放的就是gScore最大的值,即按gScore递减来排序,若gScore相同,则按姓名升序排列(e.g.先d后w)

3.链表题目

class Node {
    int address;
    int data;
    int next;
    Node(int address, int data, int next) {
        this.address = address;
        this.data = data;
        this.next = next;
    }
}

五、20190908PAT乙级考试总结

第一题简单,很快就做完了。第二题扣了1分,到考试结束也没发现错在哪。第三题要注意a的范围是从m到n,边界值都取得到。第四题输出的要求是按n递增输出,按照遍历的顺序输出是按A递增输出的,应该是因为这一点扣了8分。最后一道是链表题,之前做过类似的题目、记得最大公约数怎么求就没啥问题。补充:尽量还是用C/C++,不然太容易超时了,我最后一题用的Java超时扣了6分。

转载于:https://www.cnblogs.com/nomad1c/p/11495079.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PAT乙级1009题是一个关于字符串处理的题目。根据题目要求,我们需要将输入的字符串按照单词的逆序输出。根据提供的引用内容,我们可以看到有三种不同的解法。 引用\[1\]和引用\[2\]是两个相似的解法,使用了字符串处理函数strchr和strrchr来定位空格字符,并将字符串分割成单词。然后通过循环输出单词,最后输出剩余的最后一个单词。 引用\[3\]是另一种解法,使用了二维数组来存储每个单词。通过循环读取输入的字符串,直到遇到换行符为止。然后通过倒序循环输出每个单词。 根据题目要求,你可以选择其中一种解法来完成PAT乙级1009题。 #### 引用[.reference_title] - *1* [PAT考试乙级1009(C语言实现)](https://blog.csdn.net/JeffreyDDD/article/details/78395267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PAT乙级1009(C语言实现)](https://blog.csdn.net/weixin_62870950/article/details/124934829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [PAT乙级测试题1009(C语言实现)](https://blog.csdn.net/weixin_45947840/article/details/105943475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值