手写代码模块(Java实现)——常用笔试算法思路模板

本文提供了手写代码模块的Java实现,涵盖了递归、回溯、动态规划、并查集等常用算法思想及模板,适用于算法笔试准备。通过具体示例,如链表合并、二叉树深度计算、字符串排列、礼物最大价值获取和并查集应用,深入浅出地讲解了每种算法的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手写代码模块(Java实现)——常用笔试算法思路模板

1.递归

例题:剑指Offer 25. 合并两个排序的链表

public ListNode Merge(ListNode list1, ListNode list2) {
    if (list1 == null)
        return list2;
    if (list2 == null)
        return list1;
    if (list1.val <= list2.val) {
        list1.next = Merge(list1.next, list2);
        return list1;
    } else {
        list2.next = Merge(list1, list2.next);
        return list2;
    }
}

例题:剑指Offer 55.1 二叉树的深度

public int TreeDepth(TreeNode root) {
    return root == null ? 0 : 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right));
}
2.回溯

例题:剑指Offer 38. 字符串的排列

private ArrayList<String> ret = new ArrayList<>();

public ArrayList<String> Permutation(String str) {
    if (str.length() == 0)
        return ret;
    char[] chars = str.toCharArray();
    Arrays.sort(chars);
    backtracking(chars, new boolean[chars.length], new StringBuilder());
    return ret;
}

private void backtracking(char[] chars, boolean[] hasUsed, StringBuilder s) {
    if (s.length() == chars.length) {
        ret.add(s.toString());
        return;
    }
    for (int i = 0; i < chars.length; i++) {
        if (hasUsed[i])
            continue;
        if (i != 0 && chars[i] == chars[i - 1] && !hasUsed[i - 1]) /* 保证不重复 */
            continue;
        hasUsed[i] = true;
        s.append(chars[i]);
        backtracking(chars, hasUsed, s);
        s.deleteCharAt(s.length() - 1);
        hasUsed[i] = false;
    }
}
3.动态规划 DP

例题:剑指Offer 47. 礼物的最大价值

public int getMost(int[][] values) {
    if (values == null || values.length == 0 || values[0].length == 0)
        return 0;
    int n = values[0].length;
    int[] dp = new int[n];
    for (int[] value : values) {
        dp[0] += value[0];
        for (int i = 1; i < n; i++)
            dp[i] = Math.max(dp[i], dp[i - 1]) + value[i];
    }
    return dp[n - 1];
}
4.并查集
import java.util.Scanner;

public class UF {
    private int[] id;
    private int[] sz; // weight for node
    private int count;
    public UF(int N){
        count = N;
        id = new int [N];
        for (int i = 0;i<N;i++) {
            id[i] = i;
        }
        sz = new int [N];
        for (int i = 0;i<N;i++) {
            sz[i] = 1;
        }
    }
    public int find (int x){
        int p = x, t;
        while (p != id[p])
            p = id[p];
        // path yasuo
        while (x != p)
        {
            t = id[x];
            id[x] = p;
            x = t;
        }
        return x;
    }
    public boolean connected(int  p, int q){
        return  find(p) == find(q);
    }
    public void union(int p, int q){
        int pRoot = find(p);
        int qRoot = find(q);
        if (pRoot == qRoot)
            return;
        // add the little tree to big tree
        if (sz[pRoot] < sz[qRoot]){
            id[pRoot] = qRoot;
            sz[qRoot] += sz[pRoot]; //
        }
        else{
            id[qRoot] = pRoot;
            sz[pRoot] += sz[qRoot];
        }
        count--;
    }

    // test
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        UF uf = new UF(N);
        while(scanner.hasNext()){
            int p = scanner.nextInt();
            int q = scanner.nextInt();
            if (uf.connected(p, q))
                continue;
            uf.union(p, q);
            System.out.println(p + " " + q);
        }
        System.out.println(uf.count + "components");
    }
}


5.答题模板基本IO
import java.util.Arrays;
import java.util.Scanner;
public class Solutuion {
    /*数值*/
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in) ;
        while(reader.hasNext())
        {
            int m = reader.nextInt() ;
            int [] numbers = new int[m] ;
            for(int index=0;index<m;index++)
            {
                numbers[index] = reader.nextInt();
            }
            System.out.println(Arrays.toString(numbers));
        }
        reader.close() ;
    }
    /*字符串*/
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String c = in.next() ;
        System.out.println(c);
        in.close();
    }
    /*格式化输出*/
    System.out.printf('%8.2f',float) ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值