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

[高频题] 428 LeetCode 求解一行代码

全局:

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

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

x

https://leetcode.com/problems/se ... rialize-n-ary-tree/  

下面代码可以运行,那么第42行为何是     private Node _deserialize(char[] s, int[] p) {   ---> 这里为何不能直接用int,而用int[]呢?  

下面开始是第一行:
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) {

        // 边界条件,如果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;

        // 循环检查孩子
        while (s[p[0]] == '[') {

            root.children.add(_deserialize(s, p));

        }

        p[0] += 1;

        return root;
    }
}

上一篇:分享一个写的很好的算法学习和刷题指南
下一篇:刷题心得:别人最高vote的最优解不一定好解释
推荐
红A 2020-4-2 11:41:26 | 只看该作者
全局:
因为java是pass by address value, 传array进去reference是不变的,array里面的数字是可以变的。变完之后还能外部拿这个array还可以变化,但是如果传int,改变之后外部是拿不到值的。

另外解法可以优化下
  1. class Codec {

  2.     // Encodes a tree to a single string.
  3.     public String serialize(Node root) {
  4.         List<String> res = new ArrayList<>();
  5.         dfs(root, res);
  6.         return String.join(",", res);
  7.     }

  8.     public void dfs(Node root, List<String> list) {
  9.         if (root == null) return;
  10.         list.add(String.valueOf(root.val));
  11.         list.add(String.valueOf(root.children.size()));
  12.         for (Node child: root.children) dfs(child, list);
  13.     }
  14.    
  15.    
  16.     // Decodes your encoded data to tree.
  17.     public Node deserialize(String data) {
  18.         if (data.equals("")) return null;
  19.         String[] strs = data.split(",");
  20.         Queue<String> q = new LinkedList<>();
  21.         for (String s: strs) q.add(s);
  22.         return dfs(q);
  23.     }
  24.    
  25.     public Node dfs(Queue<String> q) {
  26.         Node root = new Node();
  27.         root.val = Integer.valueOf(q.poll());
  28.         int size = Integer.valueOf(q.poll());
  29.         root.children = new ArrayList<>();
  30.         for (int i = 0; i < size; i++) {
  31.             root.children.add(dfs(q));
  32.         }
  33.         return root;
  34.     }
  35. }
复制代码

评分

参与人数 1大米 +2 收起 理由
yeehaah + 2

查看全部评分

回复

使用道具 举报

全局:
我有你要买的课😂😂
回复

使用道具 举报

🔗
 楼主| zebointexas 2020-4-5 02:26:54 | 只看该作者
全局:
sugar223322 发表于 2020-4-3 11:39
我有你要买的课😂😂

同学有兴趣一起刷题吗,我有刷题群,可以加你
回复

使用道具 举报

🔗
 楼主| zebointexas 2020-4-5 02:27:32 | 只看该作者
全局:
rexue70 发表于 2020-4-2 11:41
因为java是pass by address value, 传array进去reference是不变的,array里面的数字是可以变的。变完之后还 ...

请问是怎么做到上传代码的~ 感谢
回复

使用道具 举报

🔗
 楼主| zebointexas 2020-4-5 02:30:22 | 只看该作者
全局:
rexue70 发表于 2020-4-2 11:41
因为java是pass by address value, 传array进去reference是不变的,array里面的数字是可以变的。变完之后还 ...

老哥我的速度好像比你快啊?  
回复

使用道具 举报

🔗
红A 2020-4-5 04:08:07 | 只看该作者
全局:
zebointexas 发表于 2020-4-5 02:30
老哥我的速度好像比你快啊?

可以换成stringbuilder会快一点。另外这个速度不是n2和n的差别。。。速度差距没关系。
回复

使用道具 举报

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

本版积分规则

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