zoukankan      html  css  js  c++  java
  • 折纸问题

    阐述

    请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展开。此时有 1 条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折 N 次。请从上到下计算出所有折痕的⽅向。

    给定折的次数 n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".

    样例

    输入:1
    返回:["down"]
    
    输入:2
    返回:["down", "down", "up"]
    

    思路

    • 模型为满二叉树
    • 通过层序遍历构造这颗树
    • 通过中序遍历打印这颗树

    实现

    function Tree(value) {
      this.value = value
      this.left = null
      this.right = null
    }
    
    // 此函数的代码为核心代码
    function createTree(n) {
      let t0 = new Tree('down')
      let oldArr = [t0]
      let tempArr = []
      for (let i = 1; i < n; i++) {
        while (oldArr.length > 0) {
          let t = oldArr.shift()
          t.left = new Tree('down')
          t.right = new Tree('up')
          tempArr.push(t.left)
          tempArr.push(t.right)
        }
        oldArr = tempArr
        tempArr = []
      }
      return t0
    }
    
    function inOrderTree(t, cb) {
      function _inOrder(t) {
        if (t.left) {
          _inOrder(t.left)
        }
        cb(t.value)
        if (t.right) {
          _inOrder(t.right)
        }
      }
      _inOrder(t)
    }
    
    function fold(n) {
      let tree = createTree(n)
      let arr = []
      inOrderTree(tree, (v) => {
        arr.push(v)
      })
      return `[${arr.join(',')}]`
    }
    // no-log
    

    测试

    // log
    // 1次
    console.log(fold(1))
    // 2次
    console.log(fold(2))
    // 3次
    console.log(fold(3))
    // 4次
    console.log(fold(4))
    

    来源

    https://www.nowcoder.com/questionTerminal/430180b66a7547e1963b69b1d0efbd3c

  • 相关阅读:
    【模拟练习】[一]
    【搜索练习】【二】
    【搜索练习】【一】
    模板整理 (施工中 2017.8.30更新)
    常用STL整理 (施工中 2017.8.11更新)
    剑指Offer 反转链表
    剑指Offer 链表中倒数第k个结点
    剑指Offer 斐波那契数列
    剑指Offer 用两个栈实现队列
    剑指Offer 从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/oceans/p/13741958.html
Copyright © 2011-2022 走看看