一、 输入输出
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