手写代码模块(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) ;
}