PTA上提交Java程序的⼀些套路
⽬录
在提交Java程序需要注意如下⼏个要点:
0. 不要包含package关键字
提交的代码中⼀定不要包含package关键字。
1. Main类与Scanner
1.1 Main类
你提交的所有程序都应该以如下形式出现
public class Main{
public static void main(String[] args){
//其他代码
}
}
即,代码中必须存在⼀个public class Main。不允许出现其他的public class。
1.2 使⽤Scanner处理输⼊
Java中使⽤Scanner处理输⼊。你需要注意如下⼏个地⽅
程序开头必须import java.util.Scanner导⼊Scanner类。
使⽤Scanner sc = new Scanner(System.in);⽣成scanner对象。
该Scanner对象sc可以处理标准输⼊。所谓的标准输⼊,在你的电脑上就是你从键盘通过控制台进⾏的输⼊。注意:字符串本⾝,也可被Scanner对象处理,如下代码就可以处理字符串:
String str = "1 a 3.0";
Scanner sc = new Scanner(str);
//现在就可以通过sc来处理字符串str,⽐如将其中的每个字符取出来。
int x = sc.nextInt();    //将字符串中的1读出来,并转化为int型
String y = sc.next();  //将字符串中的a读出来,是String型
double z = sc.nextDouble();  //将字符串中的3.0读出来,并转化为double型
⽰例程序1:不断读⼊字符并转化为int然后相加,直到没有输⼊为⽌
import java.util.Scanner;//导⼊Scanner类
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//⽣成Scanner对象
while (sc.hasNextInt()) {
int a = sc.nextInt(); //读下⼀个整型字符串
int b = sc.nextInt();
System.out.println(a + b);
}
sc.close(); //⽤完后关闭扫描器是⼀个好的习惯
}
}
while (sc.hasNextInt())这个语句的含义是指,当标准输⼊的下⼀个标记是整型则继续处理,直到没有输⼊为⽌。
如果输⼊1 2 3 4 a,那么只能处理前⾯的1、2、3、4。在处理a时跳出,因为a不是整型字符串。
根据需要也可将sc.hasNextInt()改成sc.hasNext(),可⽤来判断是否还有下⼀个输⼊标记(不管是不是int)。使⽤sc.next()获取下⼀个输⼊标记(String 型)。
注意:尽量不要使⽤while(true)的⽅式来处理多次输⼊,否则在PTA系统中有可能出错。
⽰例程序2:不断读⼊字符(以⾏的⽅式读取),直到碰到end为⽌
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//⽣成Scanner对象
String x = sc.nextLine();
while (!x.equals("end")) {
System.out.println(x);
x  = sc.nextLine();
}
sc.close(); //⽤完后关闭扫描器是⼀个好的习惯
}
}
⽰例程序3:读⼊n,然后循环读⼊n⾏数据
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//⽣成Scanner对象
int n = sc.nextInt();
for(int i = 0; i < n; i++){
//接下来处理⼀⾏输⼊,⽐如⼀⾏的数据为"zhang 18"
String name = sc.next();
int age = sc.nextInt();
//然后对name、age进⾏处理
}
sc.close(); //⽤完后关闭扫描器是⼀个好的习惯
}
}
Scanner如何处理字符串中每个标记?
Scanner在处理字符串对象时,如果使⽤next函数,默认以空格、多个空格或者回车换⾏符作为分隔。⽐如上⾯这段程序,当我们输⼊为
1x 2y
或者
1x
2y
Scanner将输⼊分解成两个标记1x和2y。
本机上如何快速测试?
打开记事本(Notepad)。
复制输⼊样例中的数据到记事本。注:如果每⾏数据之间有不应该出现的空⾏,请先删除空⾏。
全选复制(Ctrl+a, Ctrl+c)记事本的数据。注:为了将最后⼀⾏数据后⾯的回车换⾏也复制上。
运⾏程序后,在控制台粘贴(Ctrl+v)。
2.Scanner对象常⽤⽅法
hasNext() //返回true或false,看有⽆下⼀个标记(字符串类型)。
⽐如对于a b c,现在处理到a,那么下⼀个标记就是b。
next() //返回类型为String(字符串),返回下⼀个标记。不会读取回车换⾏。
hasNextInt() //返回true或false,看有⽆下⼀个整型字符串标记。
nextInt() //返回类型int,将下⼀个整型字符串标记转化为int型返回。
nextBoolean() //返回类型为boolean,可以处理字符串true或者false,
nextDouble() //返回类型为double,可以处理字符串如1 2.3 -1.3等。
nextLine() //返回类型为String(字符串对象),返回⼀整⾏。会读取回车换⾏符。
3.字符串与整型互相转换
常⽤处理代码
String str = sc.nextLine();
int numStu = Integer.parseInt(str);
//也可使⽤如下代码
int num = sc.nextInt();  //字符串->整型
String x = num+"";      //整型->字符串,其中""为空字符串。任何基本类型数据与字符串+,都将转化为字符串。
也可以使⽤Double.parseDouble处理double类型数据,还有Long, Boolean等对象均有相似⽅法。
4.Scanner常见问题
该部分内容统⼀移到⽂章尾部的常见问题章节。
5.输出
5.1 System.out.println("abc")打印字符串"abc"并回车换⾏。可使⽤+号连接各个类型的变量,组装成字符串。
int x = 1;
String str = "abc";
System.out.println(x+2+"-"+str); //输出12-abc。即,可以使⽤+拼接各个类型的变量,转化为字符串
5.2 System.out.print("abc")打印字符串"abc",不打印回车换⾏。
5.3 格式化输出:
代码:System.out.printf("%d,%.3f,%5s,%b,80%%,end%n",123,3.141592654,"abcdef",true);
输出:123,3.142,abcdef,true,80%,end
说明:
%d,按⼗进制整数格式输出。%.3f,输出浮点数保留3位⼩数。
%-5s,按字符串格式输出,输出宽度为5。如果超过5个字符,则鸳鸯输出。如果为不⾜5个字符,右⽅填充空格。%5s,左⽅填充空格。%b,按boolean型格式输出。
%%,输出%。
%n,输出⾏分隔符,如回车换⾏。
更多格式字符⽤法请查看API⽂档中Formatter类的格式字符串语法节。
6.动态创建数组与ArrayList
有的时候需要动态创建⼀个数组来存放输⼊的数据。
int n = sc.nextInt();
int[] arr = new int[n];//动态创建⼤⼩为n的数组
for(int i = 0; i < n; i++){
arr[i] = sc.nextInt();
}
如果待输⼊的数据不确定,⽆法⼀开始就确定数组的⼤⼩。我们可以使⽤ArrayList代替数组。
List<String> strList = new ArrayList<String>();//Java 7中可以List<String> strList = new ArrayList<>();
while(sc.hasNextLine()){
strList.Line());
}
//遍历输出列表中的内容
for (int i = 0; i < strList.size(); i++) {
java中split的用法String str = (i);
System.out.println(str);
}
//或者
for(String e: strList){
System.out.println(e);
}
7.常见问题
7.1 本机编译通过的Java程序,在PTA上提⽰编译错误或者直接⽆法运⾏
提交的public class类名不为Main,⽐如,提交的类名如果是public class Main1就会出错。
提交的代码中有多个public class。注意:提交的代码中只能有⼀个public class。
复制的时候将程序第⼀⾏package也复制进来。
提交的代码中出现中⽂。注意:提交的代码中任何时候都不要出现中⽂,注释也不要出现中⽂。
PTA上的Java暂时为Java 6,如果⽤Java7或8的语法可能会出错。最新版的PTA使⽤Open JDK 8,已
经⽀持Java 8。估计还不⽀持Java 9,请不要⽤Java 9中的新语法。注意:中国⼤学mooc⽹的程序评测平台可能仅⽀持Java 6。
7.2 本机运⾏正确的代码放到PTA上提交提⽰“答案错误”或”格式错误”。
确定使⽤前⾯提到的本机上如何快速测试的⽅法进⾏测试,请仔细⽐对样例输⼊与输出。
你的代码输出确实有误。题库中的集美⼤学Java题集的题⽬已经经过上百次有效提交,⼀般不会有错,请仔细核对。核对⽅法:将样例输出放到屏幕左侧,你的程序输出放到右侧,逐⾏对⽐。
显⽰格式错误,⼀般是因为你的输出最后⼀⾏少了回车换⾏,或者每⾏的⾏尾多了空格之类的错误。
7.3 nextLine与其他next***混⽤的坑
此坑⾮常坑。建议所有⼈仔细阅读。
for (int i = 0; i < 3; i++) {
int x = sc.nextInt();
String str = sc.nextLine();
System.out.println("x="+x+" str="+str);
}
当我们输⼊1并按回车的时候,就直接输出x=1 str=。可以看到sc.nextLine()并没有读取到任何东西。
实际上它读取了1后⾯的回车换⾏符。我们应将其改为sc.next()。
结论:当题⽬要求中⼀会要输⼊数字、⼀会⼜要输⼊字符,⼀会⼜要整⾏读取。不要混合使⽤nextInt(),next(),nextLine()⽅法。不妨全部使
⽤nextLine()整⾏读⼊后,再进⾏处理。
其他:对于这个问题,我在PTA题库中创建了1题jmu-Java-01⼊门-使⽤Scanner处理输⼊,格式化输出与String,主要⽤来考察Scanner处理输⼊、格式化输出、String的常见使⽤。欢迎⼤家使⽤。
7.4 重复创建Scanner对象
下⾯的代码中存在⼀个⾮常典型的错误
for (int i = 0; i < 3; i++) {
Scanner sc = new Scanner(System.in);//没有必要重复创建Scanner对象!运⾏时会导致结果不正确。
int x = sc.nextInt();
String str = sc.nextLine();
System.out.println("x="+x+" str="+str);
}
应将Scanner sc = new Scanner(System.in);移到for循环外。
这个错误很有隐蔽性。学⽣⾃⼰在控制台⼀个⼀个输⼊的时候不会出错,但是如果将多⾏输⼊批量粘贴过来就⽆法得到正确结果
7.5 控制台如何跳出⽆限循环?
按Ctrl+z或者强制终⽌程序。
7.6 程序中包含多个类怎么提交?
可以将多个类写⼊⼀个⽂件。但只有Main类使⽤public修饰。
class Teacher{
}
public class Main{
public static void main(String[] args) {
}
}
7.7 输⼊⽤例数据量太⼤,造成超时怎么办?
直接使⽤(System.in)相关⽅法读取⽤例速度较慢,碰到数据量较⼤的⽤例输⼊容易造成超时。
这时可尝试使⽤BufferedReader这种带缓冲区的输⼊并结合InputStreamReader,将极⼤提⾼读⼊速度。参考代码如下:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inStr = br.nextLine();
不过要谨慎处理inStr,否则因为String的不可变性,有可能导致⽣成⼤量字符串对象,从⽽使得内存超出限制。
⼀般来说⼀⾏有多个值,如果使⽤inStr.split()虽可将多个值取出。但是速度和内存可能依然会超出题⽬限制。
可尝试结合使⽤StringTokenizer进⾏处理。详见如下参考⽂章。
8. Java语法练习题集PTA分享码
⽂章更新记录
20210411更新
增加7.7 输⼊⽤例数据量太⼤,造成超时怎么办?
201708新版改版说明
PTA与2017年8⽉已升级成新版,域名改为,官⽅建议使⽤Firefox与Chrome浏览器。
旧版 PTA ⽤户⾸次在新版系统登录时,请选择“旧版⽤户迁移”,输⼊旧版⽤户名、密码、以及⾃⼰可收到邮件的注册邮箱,通过邮件激活新版账户。然后使⽤邮箱登录系统。注意1:⽆法收到激活邮件的,请到垃圾邮件中查。注意2:有的账号提⽰激活失败,可能是已激活成功,他⼜来⼀次,就会有这提⽰,如果⽤邮箱不能登录,密码不对可能就密码少于8位,重置密码就⾏了。注意3:如果还是没有收到激活邮件,可以点击重新发送激活邮件,然后过⼀会到收件箱或者垃圾箱中查。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。