博客 / 詳情

返回

[Java] ACM 模式刷題模板——面試時手動構建鏈表、二叉樹

最近許多小夥伴都開始秋招了,有的同學習慣了力扣的核心代碼模式,在筆試、面試的時候適應不了需要手動處理輸入輸出的 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;
    }
}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.