剑指offer(61-66)编程题

61、请实现两个函数,分别用来序列化和反序列化二叉树。

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

初始:

1 public class Solution {
2     String Serialize(TreeNode root) {
3         
4   }
5     TreeNode Deserialize(String str) {
6        
7   }
8 }

代码:

 1 class TreeNode {
 2     int val = 0;
 3     TreeNode left = null;
 4     TreeNode right = null;
 5 
 6     public TreeNode(int val) {
 7         this.val = val;
 8 
 9     }
10 
11 }
12 
13 public class Solution {
14 
15     // 便于反序列化的操作
16     int index = -1;// 不要 private static int index = -1 ,在牛客网这种写法会报错(非常的奇怪)
17 
18     String Serialize(TreeNode root) {
19 
20         // 创建结果集对象
21         StringBuilder sb = new StringBuilder();
22 
23         // 递归的出口
24         if (root == null) {
25             sb.append("#!");// 序列化时通过某种符号表示空节点(#)
26             return sb.toString();
27         }
28 
29         sb.append(root.val + "!");// 若为非空节点,则输入“值!”
30         sb.append(Serialize(root.left));// 递归序列化左子树
31         sb.append(Serialize(root.right));// 递归序列化右子树
32 
33         return sb.toString();
34     }
35 
36     TreeNode Deserialize(String str) {
37 
38         index++;
39 
40         // 临界值
41         if (index >= str.length()) {
42             return null;
43         }
44 
45         TreeNode ans = null;
46 
47         String[] arr = str.split("!");// 分隔字符串
48 
49         if ("#".equals(arr[index])) {
50 
51             return ans;
52         }
53 
54         ans = new TreeNode(Integer.parseInt(arr[index]));// 重构二叉树
55         ans.left = Deserialize(str);
56         ans.right = Deserialize(str);
57 
58         return ans;
59 
60     }
61 }

64、给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

分析:这道题注意通过滑动窗口的大小数组的长度确认总轮数,为 num.length - size +1 次。然后比较每轮的最大值,比较过程可以借用选择排序思想。

 1 import java.util.ArrayList;
 2 
 3 public class Solution {
 4     public ArrayList<Integer> maxInWindows(int[] num, int size) {
 5 
 6         // 结果集对象
 7         ArrayList<Integer> ans = new ArrayList<Integer>();
 8 
 9         if (num == null || num.length == 0 || size == 0 || size > num.length) {
10             return ans;
11         }
12 
13         // 存储每次窗口中的最大值
14         int curMax = 0;
15 
16         for (int i = 0; i <= num.length - size; i++) {// 控制轮数
17 
18             curMax = num[i];
19             for (int j = i; j < i + size; j++) {
20                 if (num[j] > curMax) {
21                     curMax = num[j];
22                 }
23             }
24 
25             // 加入到结果集当中
26             ans.add(curMax);
27         }
28         return ans;
29     }
30 }

猜你喜欢

转载自www.cnblogs.com/tubeWang/p/11371600.html