不准访问
- 积分
- 121
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-1-21
- 最后登录
- 1970-1-1
|
注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
本帖最后由 zurich.hill 于 2020-9-8 00:46 编辑
代码如下,第42行的参数为何是 int[] p, 明明从头到尾只用到了p[0]一个元素。但这样运行成功。如果改成 单个 int,运行超时
跪求高见。
(而且,就算我设置一个全局变量 p,也是超时。)
- class Codec {
- // Encodes a tree to a single string.
- public String serialize(Node root) {
-
- StringBuilder sb = new StringBuilder();
-
- _serialize(root, sb);
-
- return sb.toString();
- }
- // Decodes your encoded data to tree.
- public Node deserialize(String data) {
-
- if (data == null) return null;
-
- return _deserialize(data.toCharArray(), new int[] {0});
-
- }
-
- // 压缩
- private void _serialize(Node root, StringBuilder sb) {
-
- if (root == null) return;
-
- sb.append("[").append(root.val);
-
- if (root.children != null) {
-
- for (Node child: root.children) {
-
- _serialize(child, sb);
- }
- }
-
- sb.append("]");
-
- }
-
- // 解压 --> p存储index
- private Node _deserialize(char[] s, int[] p) { // 为何是 int[] p 而不是 int p ???
-
- // 边界条件,如果p[0]越界,那么返回空
- if (p[0] >= s.length) return null;
-
- // 设置初始值 --> we need to plus one because we have "[" at the beginning of the string
- int j = p[0] + 1;
-
- // 初始化root的值
- int val = 0;
-
- // 只要没有越界 并且s[j]是一个数字 --> 这里在还原val
- while (j < s.length && s[j] >= '0' && s[j] <= '9') {
-
- // 获取这个数字,因为可能是几位数比如145,而不是个位数
- val = val * 10 + (s[j] - '0');
-
- j++;
- }
-
- // 制造节点 --> using the previously rebuilt val
- Node root = new Node(val, new ArrayList<>());
-
- // 这时候j已经指向下一个"["
- p[0] = j;
-
- // 给root加孩子 --> 这里自己画一画,就是每次制造节点,再给节点添加孩子。
- while (s[p[0]] == '[') {
-
- root.children.add(_deserialize(s, p));
-
- }
-
- p[0] += 1;
-
- return root;
- }
- }
复制代码
|
上一篇: Leetcode一问下一篇: Do not use class member/global/static variables to store states. Your encode ...
|