ACM模式归纳总结

ACM pattern

  • 注意类名必须为 Main, 不要有任何 package xxx 信息

1.输入与输出

1. 单个输入与单行输入

输入一个数,或者字符串,或者一行数中间用空格隔开:

1.1输入一个数
import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int num = in.nextInt();System.out.println(num);}
}

byte/ double/ float/ int/ long/ short 类型的类似:

nextDouble();
nextByte();
nextLong();
nextBoolean();
1.2输入一个字符串
next()、nextLine()都可以:
不过要注意 
next()不会吸取字符前后的空格/Tab键,只吸取字符,开始吸取字符(字符前后不算)直到遇到空格/Tab键/回车截止吸取;
nextLine()吸取字符前后的空格/Tab键,回车键截止。String str1 = sc.next(); //接收第1个值
String str2 = sc.nextLine(); //接收的是一整行
1.3输入一个char类型字符

Scanner本身并不支持获取char类型的数据,但是可以通过charAt()方法截取string的首位来获取char类型的数据。

char c = scanner.next().charAt(0);

输入一行数据or字符串,中间用空格隔开
对于不同数据类型的方法都类似,连续用几次next()或者nextInt()函数:

String a = sc.next();// 接收第1个值String b = sc.next();// 接收第2个值String c = sc.next();// 接收第3个值

2.多行输入

2.1给出了矩阵的行列数,用for遍历
第一行是两个用空格隔开的正整数n与m,n为行数,m为列数。
接下来的n行,每行是m个用空格隔开的正整数。如:
2 3
5 6 8
1 6 9
想要用二维数组接收:

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);//用二维数组接收:int m = in.nextInt();int n = in.nextInt();int[][] nums = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {nums[i][j] = in.nextInt();System.out.print(nums[i][j]);}}}
}

注意在验证的时候,分隔号一定要用双引号隔开,单引号字符会参与计算!!

2.2没有给出具体的行列数,用hasNextLine()判断
有些输入可能是:
输入一个矩阵,每行以空格分隔。
1 2 3
56 8 2 9
对于这种没有给定矩阵行列数的输入,我们只能按照字符串拆分来进行。

Integer.parseInt(s)的作用就是把字符串s解析成有符号的int基本类型。

        String s1 = "1000";String s2 = "1000";int n1 = Integer.parseInt(s1);int n2 = Integer.parseInt(s2);if (n1 == n2) {         System.out.println("Integer.parseInt(s1) == Integer.parseInt(s2)");}

Integer.valueOf(s)把字符串s解析成Integer对象类型,返回的integer 可以调用对象中的方法。

        String s = "123";Integer integer = Integer.valueOf(s);System.out.println("integer : " + integer);

联系:
这里提一下parseInt()valueOf()的区别:
Integer.parseInt(str)返回值是int型的;
Integer.valueOf(str)返回值是Integer型的。

但是

Integer.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,在jdk8中已经自动实现了自动解包装和自动包装,所以两种方式都能得到想要的整数值。

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);List> list = new ArrayList<>();while (in.hasNextLine()) {List line = new ArrayList<>();String str = in.nextLine();String[] arr = str.split(" ");for (String s : arr) {line.add(Integer.valueOf(s));}list.add(line);}System.out.println(list);}
}
2.3输入数组中带有中括号和逗号
有些输入可能是,输入一个矩阵:
[[3,2,3],
[1,6,5],
[7,8,9]]
对于这种没有给定矩阵行列数的输入,而且还包含中括号和逗号的输入,我们也是只能按照字符串拆分来进行。这里逗号和右中括号是关键。
import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);List> list = new ArrayList<>();while (in.hasNextLine()) {List line = new ArrayList<>();String str = in.nextLine();//只要改这里就可以,加几个replace()//string.replace(char oldChar, char newChar)//replace()方法用 新的字符/文本 替换字符串中每个匹配的旧字符/文本。String[] arr = str.replace("[", "").replace("]", "").replace("],", "").replace(" ", "").split(",");for (String s : arr){line.add(Integer.valueOf(s));}list.add(line);}System.out.println(list);}
}

3.解析逗号分隔符的字符串

输入用逗号分隔的字符串: 1,5,9,6,5,7,2
想要接收后变成int类型数组:

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String str = in.next();String[] arr = str.split(",");int[] nums = new int[arr.length];for (int i = 0; i < arr.length; i++) {nums[i] = Integer.parseInt(arr[i]);System.out.print(nums[i]);}}
}

4.输出写法

//换行打印,输出之后会自动换行
System.out.println();
//不换行打印
System.out.print();
//按格式输出
System.out.printf();

对于printf

/*** 输出字符串 ***/
// %s表示输出字符串,也就是将后面的字符串替换模式中的%s
System.out.printf("%s", new Integer(1212));
// %n表示换行
System.out.printf("%s%n", "end line");
// 还可以支持多个参数
System.out.printf("%s = %s%n", "Name", "Zhangsan");
// %S将字符串以大写形式输出
System.out.printf("%S = %s%n", "Name", "Zhangsan");/*** 输出整数类型***/
Integer iObj = 342;
// %d表示将整数格式化为10进制整数
System.out.printf("%d; %d; %d%n", -500, 2343L, iObj);
// %o表示将整数格式化为8进制整数
System.out.printf("%o; %o; %o%n", -500, 2343L, iObj);
// %x表示将整数格式化为16进制整数
System.out.printf("%x; %x; %x%n", -500, 2343L, iObj);
// %X表示将整数格式化为16进制整数,并且字母变成大写形式
System.out.printf("%X; %X; %X%n", -500, 2343L, iObj);/*** 输出浮点类型***/
Double dObj = 45.6d;
// %f表示以十进制格式化输出浮点数
System.out.printf("%f; %f; %f%n", -756.403f, 7464.232641d, dObj);
// 还可以限制小数点后的位数
System.out.printf("%.1f; %.3f; %f%n", -756.403f, 7464.232641d, dObj);

5.注意点

  • 多组测试数据:

如果出现多组测试数据放在一起的情况,直接在最外层套while(sc.hasNext()),每组测试数据进入一次while循环,运行一次主函数。一直等待输入,除非终止程序。

  • 高精度:

BigInteger和BigDecimal可以说是acmer选择java的首要原因。

函数:add, subtract, divide, mod, compareTo等,其中加减乘除模都要求是BigInteger(BigDecimal)和BigInteger(BigDecimal)之间的运算,所以需要把int(double)类型转换为BigInteger(BigDecimal),用函数BigInteger.valueOf()。

  • 一个非常容易出错的地方:(nextInt转nextLine接收)
假设输入为:
3
a 10 1 2
b 10 2
c 10 3
第一行是是数字n,表示下面有n行输入,下面的n行有字母,也有数字,字母只是标识符,不参与运算,数字的个数不固定,每一行的数字需要用List存储下来,最后将每一行的List放入一个大的List中。

正确代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();//需要在后面添加sc.nextLine();换到下一行sc.nextLine();List> adj = new ArrayList<>();for (int i = 0; i < n; i++) {List list = new ArrayList<>();String[] inputs = sc.nextLine().split(" ");for (int j = 1; j < inputs.length; j++) {list.add(Integer.valueOf(inputs[j]));}adj.add(list);System.out.println(list);}}
}
  • 赛码平台注意点:

    • 不要自定义包名称,否则会报错,即不要添加package answer之类的语句;

    • 写很多个类,但是必须有一个类名为Main,并且为public属性,并且Main为唯一的public class;

    • Main类的里面必须包含一个名字为’main’的静态方法(函数),这个方法是程序的入口。

2.数字处理

  • 如果是读取 Long,则使用:in.hasNextLong()Long a = in.nextLong()
  • 读取小数:f = scan.nextFloat()double weight = scan.nextDouble()

1.1多组空格分隔的两个正整数-每组个数相同

(1)输入描述:

输入包括两个正整数a,b(1 <= a, b <= 1000),输入数据包括多组。

(2)输出描述:

输出a+b的结果

(3)示例
输入:

1 5
10 20

输出:

6
30

代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);//注意while 处理多个casewhile (in.hasNext()) {int a = in.nextInt();int b = in.nextInt();System.out.println(a + b);}}
}

1.2第一行组数接空格分隔的两个正整数-每组个数相同

(1)输入描述:

输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 1000)

(2)输出描述:

输出a+b的结果

(3)示例
输入:

2
1 5
10 20

输出:

6
30

代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int num = in.nextInt();//遍历循环for (int i = 0; i < num; i++) {int a = in.nextInt();int b = in.nextInt();System.out.println(a+b);}}
}
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int num = in.nextInt();//num从最高到0的循环while (num--> 0) {int a = in.nextInt();int b = in.nextInt();System.out.println(a+b);}}
}

1.3空格分隔的两个正整数为 0 0 结束

(1)输入描述:

输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入

(2)输出描述:

输出a+b的结果

(3)示例
输入:

1 5
10 20
0 0

输出:

6
30

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);List list = new ArrayList();Boolean endFlag = false;// 注意 while 处理多个 case// 注意 hasNext 和hasNextLine 区别while (in.hasNextInt() && !endFlag) {int a = in.nextInt();int b = in.nextInt();if(a == 0 && b == 0) {endFlag = true;} else {list.add(a+b);}list.forEach(e -> System.out.println(e));}}
}

1.4多组空格分隔的两个正整数-每组个数不同

(1)输入描述:

输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

(2)输出描述:

每组数据输出求和的结果

(3)示例
输入:

4 1 2 3 4
5 1 2 3 4 5

输出:

14
20

代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);//注意while 处理多个casewhile (in.hasNext()) {int a = in.nextInt();int b = in.nextInt();System.out.println(a + b);}}
}

1.5每行第一个为个数后带空格分割整数为0结束

(1)输入描述:

输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。

(2)输出描述:

每组数据输出求和的结果

(3)示例
输入:

4 1 2 3 4
5 1 2 3 4 5
0

输出:

14
20

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);List list = new ArrayList<>();Boolean endFlag = false;while (in.hasNextInt() && !endFlag) {int a = in.nextInt();if(a != 0) {int sum = 0;for (int i = 0; i < a; i++) {sum += in.nextInt();}list.add(sum);}else {endFlag = true;}}list.forEach(e -> System.out.println(e));}
}

1.6第一行组数接空格分隔的两个正整数-每组个数不同

(1)输入描述:

输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。

(2)输出描述:

每组数据输出求和的结果

(3)示例
输入:

2
4 1 2 3 4
5 1 2 3 4 5

输出:

14
20

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int num = in.nextInt();for (int i = 0; i < num; i++) {int len = in.nextInt();int res = 0;for (int j = 0; j < len; j++) {int a = in.nextInt();res += a;}System.out.println(res);}}
}

1.7 输入一个数组,且给出了数组的长度

输入:

7
1 2 3 4 5 6 7

输出:

1 2 3 4 5 6 7

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int len = in.nextInt();int[] array = new int[len];for (int i = 0; i < len; i++) {array[i] = in.nextInt();}System.out.println(Arrays.toString(array));}
}

2.字符串处理

比较项next( )nextLine( )
说明只能读取到空格之前的字符串可以读取空格的字符串
比如“你好 java”“你好”“你好 java”
使用前判断in.hasNext()in.hasNextLine()

2.1 第一行个数第二行字符串

输入:

2
a b c
1 2 3

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int num = in.nextInt();in.nextLine();while (in.hasNext()){String[] s = in.nextLine().split(" ");System.out.println(s);}}
}

2.2多行空格分开的字符串

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()){String[] s = in.nextLine().split(" ");System.out.println(s);}}
}

3.核心模板

import java.util.*; 
public class Main {public static void main(String[] args) {//1.数据输入Scanner in = new Scanner(System.in);//读数字int numLen = in.nextInt();int[] numArr = new int[numLen];int i = 0;while(in.hasNextInt() && i < numLen){numArr[i] = in.nextInt();i++;}//读字符串int strLen = in.nextInt();//数字到字符串要换行in.nextLine(); String[] strArr = new String[strLen];//或者 strArr[] = in.nextLine().split(" ");int j = 0;while(in.hasNextLine() && j < strLen){strArr[j] = in.nextLine();j++;}//2. 处理Solution solution = new Solution();String result = solution.process(numArr, strArr);//3. 输出System.out.println(result);//四舍五入输出小数String str = String.format("%.2f",3.555);System.out.println(str);}
}//下面类似 LeetCode 的核心代码模式
class Solution {public String process(int[] nums, String[] strs) {StringBuilder sb = new StringBuilder();sb.append(Arrays.toString(nums));sb.append(" && ");sb.append(Arrays.toString(strs));return sb.toString();}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部