剑指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 }

原文地址:https://www.cnblogs.com/tubeWang/p/11371600.html

时间: 2024-10-08 20:04:15

剑指offer(61-66)编程题的相关文章

【剑指offer】第四题 替换空格

/** * 剑指offer 第4题 替换空格 * 特点:1.先扫描串中的空格数,计算好替换后的长度 * 2.使用双指针,从后面开始向前替换,避免从前开始每次替换后就要移动后面的所有的数据 * 测试用例:特殊:有多个空格 * 错误:数组长度不够,字符串为空 * */ package javaTrain; public class Offer4 { public static void main(String[] args) { String a = "Hello I am Daisy Dong!&

剑指offer第十八题 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解题思路:一次去掉一个外圈,当最后只剩一行或一列时停止递归.(ps:这题就是绕,仔细点就解决了!!!) 1 import java.util.ArrayList; 2 public class Solution { 3 publ

《剑指offer》第十七题:打印1到最大的n位数

// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <cstdio> #include <memory> void PrintNumber(char* number); bool Increment(char* number); void Print1ToMaxOfNDigitsRecursively(char* number, int length

[剑指Offer] 61.序列化二叉树

题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution 12 { 13 public: 14 char* Serialize(TreeNode*

《剑指offer》:[66]矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 具体是例如下图: 上图中"bcced"就存在这条路径:但是"abcb"这条路径就不存在.因为进入'b'这个格子后就不能再次进入. 解决方案:主要是用回溯法.首先任意选一个入口地址,也就是任选一个格子,如果格子中的字符ch和字符串中的第一个字符相等,

《剑指offer》之7-9题

7.斐波那契数列 问题描述 都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. 实现思想 了解斐波那契数列的规律就Ok了.1,1,2,3,5,8,... 代码 function Fibonacci(n) { // write code here if(n==0||n==1){ return n; } var N1=1,N2=0; for(let i=2;i<=n;i++){ N1=N1+N2; N2=N1-N2; } return N1; } 8.跳台阶 问题描述 一只青

【剑指offer】 第三题 二维数组查找

package javaTrain; public class offer3 { public static void main(String args[]) { int[][] a = {{0,1,2,3},{1,2,3,4},{2,3,4,5},{6,7,8,9}}; System.out.println(find(a,10)); } public static boolean find(int[][] a,int num) { if(a == null) return false; int

【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列

#include<iostream> #include<stack> using namespace std; template <typename T> void pushQueue(stack<T> &stack1, T t){ stack1.push(t); } template<typename T> T popQueue(stack<T> &stack1, stack<T> &stack2

【校招面试 之 剑指offer】第9-2题 用两个队列实现一个栈

#include<iostream> #include<queue> using namespace std; // 对于出栈解决的思路是:将queue1的元素除了最后一个外全部放到queue2中,然后再pop出queue1的最后一个元素... template<typename T> void popStack(queue<T> &queue1, queue<T> &queue2){ if(queue1.size() == 0)

【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题

题目:我们可以使用2??1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2??1的小矩形无重叠地覆盖一个2??8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着放,记总的情况为f(8).如果是竖着放,则记下来还有f(7)种放法:若是横着放,则下一块必须横着放,则还有f(6)种放法. 所以可以推导出公式:f(1) = 1 f(2) = 2 f(n)(n为偶数) = f(n-1)+f(n-2); #include<iostream> #include<