--基础算法

目录

1.判断链表中是否有环

2.二叉树的先序,中序,后序遍历

3.最长公共前缀

4.二分查找

5.栈与队列​​​​​​​


1.判断链表中是否有环

 // 链表:list.next 表示下一个节点; list.val表示该节点的数据
function hasCycle (head) {
        let first = head
        let sec = head
        while (first && first.next) {
          first = first.next.next
          sec = sec.next
          if (first == sec) {
            // 比较节点相等,不能比较数据相等(链式结构)
            return true
          }
        }
        // 没有环
        return false
      }

2.二叉树的先序,中序,后序遍历

  • 先序----遍历顺序 根 左子树 右子树
  • 中序----遍历顺序 左子树 根 右子树
  • 后续---遍历顺序  左子树 右子树 根
function threeOrders( root ) {
    // write code here
    // 先序遍历---先遍历根在遍历左子树再遍历右子树
    let preArr=[]
    function preSort(root){
        // 递归边界---root不为空
        if(root){
            preArr.push(root.val)
            preSort(root.left)
            preSort(root.right)
        }
    }
    // 中序遍历---先遍历左子树,再遍历根在遍历右子树
    let midArr=[]
    function midSort(root){
        // 递归边界---root不为空
        if(root){
            midSort(root.left)
             midArr.push(root.val)
           midSort(root.right)
        }
    }
      // 中序遍历---先遍历左子树,再遍历根在遍历右子树
    let aftArr=[]
    function aftSort(root){
        // 递归边界---root不为空
        if(root){
           aftSort(root.left)
            aftSort(root.right)
            aftArr.push(root.val)
        }
    }
    preSort(root)
    midSort(root)
    aftSort(root)
    return [preArr,midArr,aftArr]
}

3.最长公共前缀

字符串.substr(下标,字符串长度)

 function longestCommonPrefix (strs) {
        // write code here
        if (strs.length == 0 || strs[0] == '') {
          return ''
        }
        for (let i = 1; i < strs.length; i++) {
          if (strs[i].indexOf(strs[0]) != 0) {
            // 字符串i不包含字符串0
            strs[0] = strs[0].substr(0, strs[0].length - 1)
            i--
          }
        }
        return strs[0]
      }

4.二分查找

前提:数据有序!

 <script>
      /*请实现有重复数字的升序数组的二分查找
      给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1*/
      function search (nums, target) {
        let left = 0
        let right = nums.length - 1
        while (left <= right) {
          let mid = Math.floor((left + right) / 2)
          if (nums[mid] === target) {
            // 判断前面还有没有此数据
            while (mid != 0) {
              if (nums[mid - 1] !== target) {
                return mid
              } else if (nums[mid - 1] == target) {
                mid--
              }
            }
            return 0
          } else if (nums[mid] < target) {
            left = mid + 1
          } else if (nums[mid] > target) {
            right = mid - 1
          }
        }
        return -1
      }

      console.log(search([1,1,2,3,7,7,7,9,9,10], 2))
    </script>

5.栈与队列

// 栈是先进后出,队列是先进先出
      let arr1 = [] // 第一个栈用来存储数据
      let arr2 = [] // 第二个栈用来换数据
      // 增加数据--直接添加
      function push (node) {
        arr1.push(node)
      }
      // 删除数据---先倒序添加进arr2,再删除
      function pop () {
        if ((arr1.length == 0)) {
          return
        }else{
            while (arr1.length) {
          arr2.push(arr1.pop())
        }
        let flag = arr2.pop() // 删除1位
        while (arr2.length) {
          arr1.push(arr2.pop())
        }
        return flag
      }
    }
        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值