最近許多小夥伴都開始秋招了,有的同學習慣了力扣的核心代碼模式,在筆試、面試的時候適應不了需要手動處理輸入輸出的 ACM 模式。從核心代碼模式轉到 ACM 模式並不難,看完這篇文章你就可以勝任絕大部分場景。
從控制枱讀取輸入
以兩數之和為例,它的輸入是這樣的:
[2,7,11,15]
9
我們需要讀入第一行的字符串和第二行的整數,然後將字符串轉換成數組。首先,使用 Scanner 進行逐行讀取。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = s.nextLine(); //讀取字符串
System.out.println("字符串:"line);
int a = s.nextInt(); //讀取整數
System.out.println("整數:"+a);
}
}
手動構建數據結構
從控制枱讀取字符串之後,需要手動將這些字符串轉換成數組、鏈表和二叉樹,轉化的代碼都是很固定的,可以作為模板使用。
數組
數組的構建非常簡單,將字符串根據分隔符分割,然後轉換成整型即可。代碼如下:
private static int[] StringToIntArray(String str) {
String[] parts = str //根據“,”分割成字符串數組
.substring(1, str.length() - 2)
.split(",");
int[] nums = new int[parts.length];
for (int i = 0; i < parts.length; i ++)
nums[i] = Integer.parseInt(parts[i]); //轉為整型數組
return nums;
}
鏈表
鏈表的構建也不難。
private static ListNode StringToListNode(String str) {
String[] parts = str //分割字符串
.substring(1, str.length() - 2)
.split(",");
ListNode dummy = new ListNode(-1), cur = dummy; //虛擬頭結點
for (int s: parts) {
cur.next = new ListNode(Integer.parseInt(s)); //逐個添加鏈表的結點
cur = cur.next;
}
return dummy.next; //返回真正的頭結點
}
二叉樹
構建二叉樹的代碼就很長了,個人感覺手動構建二叉樹相當於一道中等題了。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
private static class TreeNode { //二叉樹類
int val;
TreeNode left, right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
TreeNode root = StringToTreeNode(str);
}
private static TreeNode StringToTreeNode(String str) {
String[] parts = str
.substring(1, str.length() - 1)
.split(",");
String item = parts[0];
TreeNode root = new TreeNode(Integer.parseInt(item)); //二叉樹的根節點
Queue<TreeNode> q = new LinkedList<>(); //使用隊列添加結點
q.offer(root);
int index = 1;
while (!q.isEmpty()) {
TreeNode node = q.poll();
if (index == parts.length) break;
item = parts[index ++];
if (!item.equals("null")) {
node.left = new TreeNode(Integer.parseInt(item));
q.offer(node.left);
}
if (index == parts.length) break;
item = parts[index ++];
if (!item.equals("null")) {
node.right = new TreeNode(Integer.parseInt(item));
q.offer(node.right);
}
}
return root;
}
}