题目主要来源:LeetCode。主要选自剑指offer、程序员面试宝典。
每日尽可能保持 N+1 道题,N 取 0 到 9。部分解法是从LeetCode上大佬们的解法中拿过来的,如有侵权,告知立删
文章目录
0x01 剑指 Offer 37. 序列化二叉树
/**
* JZ37 树的遍历
*
* @author Anjude
* @date 2021/7/18 19:39
*/
public class JZ37 {
public String serialize(TreeNode root) {
return rserialize(root, "");
}
public TreeNode deserialize(String data) {
String[] dataArray = data.split(",");
List<String> dataList = new LinkedList<String>(Arrays.asList(dataArray));
return rdeserialize(dataList);
}
public String rserialize(TreeNode root, String str) {
if (root == null) {
str += "None,";
} else {
str += root.val + ",";
str = rserialize(root.left, str);
str = rserialize(root.right, str);
}
return str;
}
public TreeNode rdeserialize(List<String> dataList) {
if (dataList.get(0).equals("None")) {
dataList.remove(0);
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(dataList.get(0)));
dataList.remove(0);
root.left = rdeserialize(dataList);
root.right = rdeserialize(dataList);
return root;
}
}
0x02 剑指 Offer 38. 字符串的排列
/**
* JZ38 TODO
*
* @author Anjude
* @date 2021/7/18 21:12
*/
public class JZ38 {
List<String> rec;
boolean[] vis;
public String[] permutation(String s) {
int n = s.length();
rec = new ArrayList<String>();
vis = new boolean[n];
char[] arr = s.toCharArray();
// 排序,便于检测重复元素
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
backtrack(arr, 0, n, sb);
return rec.toArray(new String[0]);
}
private void backtrack(char[] arr, int i, int n, StringBuilder sb) {
if (i == n) {
rec.add(sb.toString());
return;
}
for (int j = 0; j < n; j++) {
// 已被访问 || 重复元素
if (vis[j] || (j > 0 && !vis[j - 1] && arr[j - 1] == arr[j])) {
continue;
}
vis[j] = true;
sb.append(arr[j]);
backtrack(arr, i + 1, n, sb);
// 清空状态
sb.deleteCharAt(sb.length() - 1);
vis[j] = false;
}
}
}
0x03 剑指 Offer 43. 1~n 整数中 1 出现的次数
/**
* JZ43 TODO
*
* @author Anjude
* @date 2021/7/19 0:35
*/
public class JZ43 {
public int countDigitOne(int n) {
int digit = 1, res = 0;
int high = n / 10, cur = n % 10, low = 0;
while (high != 0 || cur != 0) {
if (cur == 0) res += high * digit;
else if (cur == 1) res += high * digit + low + 1;
else res += (high + 1) * digit;
low += cur * digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return res;
}
}
这篇博客包含了三部分内容:1)介绍如何序列化和反序列化二叉树,采用递归的方式实现;2)解决字符串的所有排列问题,通过回溯算法找出所有可能的排列组合;3)计算1到n整数中1出现的次数,利用数学规律高效求解。

3450

被折叠的 条评论
为什么被折叠?



