查看: 612| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 428 求问解压中的一个问题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 zurich.hill 于 2020-9-8 00:46 编辑

代码如下,第42行的参数为何是 int[] p, 明明从头到尾只用到了p[0]一个元素。但这样运行成功。如果改成 单个 int,运行超时

跪求高见。
(而且,就算我设置一个全局变量 p,也是超时。)

  1. class Codec {

  2.     // Encodes a tree to a single string.
  3.     public String serialize(Node root) {
  4.         
  5.         StringBuilder sb = new StringBuilder();
  6.         
  7.         _serialize(root, sb);
  8.         
  9.         return sb.toString();
  10.     }

  11.     // Decodes your encoded data to tree.
  12.     public Node deserialize(String data) {
  13.         
  14.         if (data == null) return null;
  15.         
  16.         return _deserialize(data.toCharArray(), new int[] {0});
  17.         
  18.     }
  19.   
  20.     // 压缩
  21.     private void _serialize(Node root, StringBuilder sb) {
  22.         
  23.         if (root == null) return;
  24.         
  25.         sb.append("[").append(root.val);
  26.         
  27.         if (root.children != null) {
  28.             
  29.             for (Node child: root.children) {
  30.                
  31.                 _serialize(child, sb);
  32.             }
  33.         }
  34.         
  35.         sb.append("]");
  36.         
  37.     }
  38.    
  39.     // 解压 --> p存储index
  40.     private Node _deserialize(char[] s, int[] p) {  // 为何是 int[] p 而不是 int p ???
  41.         
  42.         // 边界条件,如果p[0]越界,那么返回空
  43.         if (p[0] >= s.length) return null;
  44.         
  45.         // 设置初始值 --> we need to plus one because we have "[" at the beginning of the string
  46.         int j = p[0] + 1;
  47.         
  48.         // 初始化root的值
  49.         int val = 0;
  50.         
  51.         //     只要没有越界     并且s[j]是一个数字   --> 这里在还原val
  52.         while (j < s.length && s[j] >= '0' && s[j] <= '9') {
  53.             
  54.             // 获取这个数字,因为可能是几位数比如145,而不是个位数
  55.             val = val * 10 + (s[j] - '0');
  56.             
  57.             j++;
  58.         }
  59.      
  60.         // 制造节点 --> using the previously rebuilt val
  61.         Node root = new Node(val, new ArrayList<>());
  62.         
  63.         // 这时候j已经指向下一个"["
  64.         p[0] = j;
  65.          
  66.         // 给root加孩子  --> 这里自己画一画,就是每次制造节点,再给节点添加孩子。
  67.         while (s[p[0]] == '[') {
  68.             
  69.             root.children.add(_deserialize(s, p));
  70.             
  71.         }
  72.         
  73.         p[0] += 1;
  74.         
  75.         return root;
  76.     }
  77. }
复制代码



上一篇:Leetcode一问
下一篇:Do not use class member/global/static variables to store states. Your encode ...
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表