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 }
原文地址:https://www.cnblogs.com/tubeWang/p/11371600.html
时间: 2024-10-08 20:04:15