leetcode用的属于核心代码模式,面试的时候有时候需要手撕代码,算法题需要用到一种ACM模式。
想不到该怎么写还是相当尴尬的。
整理一下ACM模式。

ACM模式

开头

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);
//......
}
}

这部分基本上是通用的部分
import java.util.*:是导入util库中所有类,后面用到的Scanner包括在里面

1
2
3
4
public class Main {
public static void main (String[] args){
}
}

Main主类类下的主函数,main函数的特定写法是

1
public static void main (String[] args)//`简写为(PSVM)

Scanner

Scanner的使用需要实例化

1
Scanner in = new Scanner(System.in);

实例化后用in作为对象进行操作

Scanner对象的方法

通用处理

全部当成字符串,然后变成字符串数组(java字符串确定就是固定的)(spilt拆分),然后视后面需求对应修改

1
2
3
String[] parts = in.nextLine().spilt(" ");//1 2 3 4 用空格分开

String[] parts = in.nextLine().spilt(",");//1,2,3,4 用,分开

如果前后有 “[ ]” ,需要对字符串进行切分

1
2
3
4
5
String str = in.nextLine();
String[] parts = str.substring(1,str.length()-1).spilt(" ");//1 2 3 4 用空格分开

String str = in.nextLine();
String[] parts = str.substring(1,str.length()-1).spilt(",");//1,2,3,4 用,分开

这是处理一句的,如果多行需要逐行遍历

1
2
3
4
while (in.hasNextLine()) {
String[] parts = in.nextLine().spilt(" ");
//parts .....
}

在循环内调用 parts进行操作,例如转换为数组;

1
2
3
4
5
6
7
8
while (in.hasNextLine()) {
String[] parts = in.nextLine().spilt(" ");

int[] nums = new int[parts.length];
for (int i = 0; i < parts.length; i++) {
nums[i] = Integer.parseInt(parts[i]);
}
}

这里面是首先创建和parts等长的int []然后再逐个赋值,赋值用到方法 Interger.parseInt();
后面得到的结果是 nums 作为 int 的数组,后面可以对 int 数组操作。


有一个流处理的方案:

1
2
3
4
5
6
7
8
9
import java.util.*;  
public class Main {
public static void main(String[] args) {
// Scanner in = new Scanner(System.in);
String in = "[1,2,3,4,5]";
String[] parts = in.substring(1,in.length()-1).split(",");
int[] arr = Arrays.stream(parts).mapToInt(Integer::parseInt).toArray();
}
}

或者

1
2
3
4
5
6
7
import java.util.*;
public class Main {
public static void main(String[] args){
String in = "1,2,3,4,5";
int[] arr = Arrays.stream(in.split(",")).mapToInt(Integer::parserInt).toArray();
}
}

用到 Java8 的流部分

1
int[] arr = Arrays.stream(parts).mapToInt(Integer::parseInt).toArray(); 

输入流的应当是 Arrays类型,所以String要处理为String[],最后toArray输出。


直接读数字

1
2
3
int i = in.hasNextInt();
long l = in.hasNextLong();
double weight = in.nextDouble();

格式化输出

1
2
String str = String.format(示例);
System.out.printf(str);

输出字符串str,格式化在format进行

转换符 说明 示例 输出
%s 字符串 “Hi,%s:%s.%s”, “王南”,“王力”,“王张” Hi,王南:王力.王张
%c 字符 “字母a的大写是:%c %n”, ‘A’ 字母a的大写是:A
%b 布尔 “3>7的结果是:%b %n”, 3>7 3>7的结果是:false
%d 整数 “100的一半是:%d %n”, 100/2 100的一半是:50
%f 浮点 “50元的书打8.5折扣是:%f 元%n”, 50*0.85 50元的书打8.5折扣是:42.500000 元
%% 百分比 “上面的折扣是%d%% % n”, 85 上面的折扣是85%
%n 换行符
%tx 时间与日期