剑指offer(61-66)编程题

Posted tubewang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 

技术图片

 

以上是关于剑指offer(61-66)编程题的主要内容,如果未能解决你的问题,请参考以下文章

每日一题剑指 Offer II 041. 滑动窗口的平均值

LeetCode刷题剑指Offer05-简单-替换空格

LeetCode刷题剑指Offer6-简单-从尾到头打印链表

LeetCode刷题剑指Offer6-简单-从尾到头打印链表

*leetcode 343. 整数拆分 & 剑指offer 14

*leetcode 343. 整数拆分 & 剑指offer 14