当前位置: 首页 > news >正文

《剑指offer》分解让复杂问题更简单

1.复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用)

思路

拆分成三步

1.复制一份链表放在前一个节点后面,即根据原始链表的每个节点N创建N,把N直接放在N的next位置,让复制后的链表和原始链表组成新的链表。

2.给复制的链表random赋值,即N`.random=N.random.next。

3.拆分链表,将N`和N进行拆分,保证原始链表不受影响。

代码

    function Clone(pHead) {
      if (pHead === null) {
        return null;
      }
      cloneNodes(pHead);
      cloneRandom(pHead);
      return reconnetNodes(pHead);
    }

    function cloneNodes(pHead) {
      var current = pHead;
      while (current) {
        var cloneNode = {
          label: current.label,
          next: current.next
        };
        current.next = cloneNode;
        current = cloneNode.next;
      }
    }

    function cloneRandom(pHead) {
      var current = pHead;
      while (current) {
        var cloneNode = current.next;
        if (current.random) {
          cloneNode.random = current.random.next;
        } else {
          cloneNode.random = null;
        }
        current = cloneNode.next;
      }
    }

    function reconnetNodes(pHead) {
      var cloneHead = pHead.next;
      var cloneNode = pHead.next;
      var current = pHead;
      while (current) {
        current.next = cloneNode.next;
        current = cloneNode.next;
        if (current) {
          cloneNode.next = current.next;
          cloneNode = current.next;
        } else {
          cloneNode.next = null;
        }
      }
      return cloneHead;
    }

2.二叉搜索树转换为双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

思路

1.排序的双向链表-中序遍历二叉树

2.记录链表的最后一个节点

3.每次遍历:设置树节点的left和链表的right进行链接,链接成功后当前节点成为链表的末尾节点,并返回。

代码

       function Convert(pRootOfTree) {
      var lastNode = null;
      lastNode = convertToList(pRootOfTree, lastNode);
      while (lastNode && lastNode.left) {
        lastNode = lastNode.left;
      }
      return lastNode;
    }

    function convertToList(treeNode, lastNode) {
      if (!treeNode) {
        return null;
      }
      if (treeNode.left) {
        lastNode = convertToList(treeNode.left, lastNode);
      }
      treeNode.left = lastNode;
      if (lastNode) {
        lastNode.right = treeNode;
      }
      lastNode = treeNode;
      if (treeNode.right) {
        lastNode = convertToList(treeNode.right, lastNode);
      }
      return lastNode;
    }

3.字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

思路

1.把字符串分成两部分,第一个字符和后面的字符
2.整个字符串的全排列等于:第一个字符+后面字符的全排列,第一个字符和后面的字符诸葛交换。

第一个字符+后面字符的全排列3.除了第一个字符其他字符的全排列等于:第二个字符+后面字符的全排列。

3.递归,记录一个当前节点的位置,该位置指向最后一个节点时记录一次排列。

代码

    function Permutation(str) {
      var result = [];
      if (!str) {
        return result;
      }
      var array = str.split('');
      permutate(array, 0, result);
      result.sort();
      return [... new Set(result)];
    }

    function permutate(array, index, result) {
      if (array.length - 1 === index) {
        result.push(array.join(''));
      }
      for (let i = index; i < array.length; i++) {
        swap(array, index, i);
        permutate(array, index + 1, result);
        swap(array, i, index);
      }
    }

    function swap(arr, i, j) {
      [arr[i], arr[j]] = [arr[j], arr[i]];
    }

相关文章:

  • 文件编码
  • 关于springcloud Gateway中的限流
  • 老婆!辛苦了
  • 精品思维导图,流程图模板分享
  • ubuntu制作本地源
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • Activiti数据库
  • pdf文件如何在线转换为jpg图片
  • ###STL(标准模板库)
  • mysql-5.6的GTID复制的实现
  • 整理一些计算机基础知识!
  • QMake study(part 3)
  • 制作公安系统产品思路
  • 对象
  • Install Erlang in Ubuntu
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 2019.2.20 c++ 知识梳理
  • CSS中外联样式表代表的含义
  • C学习-枚举(九)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ECS应用管理最佳实践
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java小白进阶笔记(3)-初级面向对象
  • js如何打印object对象
  • js数组之filter
  • Linux下的乱码问题
  • nodejs调试方法
  • Python利用正则抓取网页内容保存到本地
  • scala基础语法(二)
  • scrapy学习之路4(itemloder的使用)
  • SQLServer之创建显式事务
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Webpack 4x 之路 ( 四 )
  • XML已死 ?
  • 汉诺塔算法
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 系统认识JavaScript正则表达式
  • 一、python与pycharm的安装
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​低代码平台的核心价值与优势
  • #Java第九次作业--输入输出流和文件操作
  • (145)光线追踪距离场柔和阴影
  • (C)一些题4
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (ZT)一个美国文科博士的YardLife
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (论文阅读40-45)图像描述1
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core控制台应用程序初识
  • .NET Core引入性能分析引导优化
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...