算法类面试题

1、算法---栈

判断括号成对出现

sdfj(nrg(lj()k)nk)sldjwef          合法

q(wdwf()hknkql(whdq)w)       合法

hk)nqeif)liq(h(flq)wj(              不合法

思路:

  括号存在嵌套关系,也存在并列关系

可以遍历字符串的每一个字符,使用栈来处理:

(1)遇到左括号,把左括号压入栈中

(2)遇到右括号,判断栈是否为空,为空说明没有左括号与之对应,则不合法。如果栈不为空,则移除栈顶的左括号---这对括号抵消了

当遍历结束后,如果栈是空的则合法,否则不合法

 

2、冒泡排序

解析:

(1)比较相邻的两个元素,如果前一个比后一个大,则交换位置

(2)第一轮的时候,最后一个元素应该是最大的一个

(3)按照步骤(1)的方法进行相邻两个元素比较,由于最后一个元素已经是最大的了,所以最后一个元素不用比较

// 冒泡排序
let arr = [1, 6, 3, 7, 5, 9, 2, 8];
function sort(arr) {
  // 升序
  console.time("冒泡排序耗时")
  let num = null
  for (let i = 0; i < arr.length - 1; i++) {
    // 外层循环的作用是:每次循环找出一个最大数放在这个数组的最后面
    for (let j = 0; j < arr.length - i - 1; j++) {
      // 内层循环的作用是:比较相邻两个数的大小从而进行交换位置
      // 借助一个中间容器交换位置
      if (arr[j] > arr[j + 1]) {
        num = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = num
      }
    }
  }
  console.log(arr)
  console.timeEnd("冒泡排序耗时")
}
sort(arr)

 

3、快速排序

解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两个部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实现快速排序。

// 快速排序
// 快速排序就是从中间取一个数,然后声明两个空数组
// 小于这个数的放在左边,大于这个数的放在右边
// 最后通过递归调用实现的一种排序方法
// 比冒泡排序用的更多

let arr = [1, 6, 3, 7, 2, 2, 2, 5, 9, 2, 8];

function sort(arr) {
  if (arr.length <= 1) {
    // 递归出口
    return arr
  }
  let middleIndex = Math.floor(arr.length / 2) // 中间数的下标,分奇偶
  let middle = arr.splice(middleIndex, 1)[0]
  let left = []
  let right = []
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < middle) {
      left.push(arr[i])
    } else{
      right.push(arr[i])
    }
  }
  return sort(left).concat([middle], sort(right))
}

console.log(sort(arr))

 

js十大排序算法:https://www.cnblogs.com/beli/p/6297741.html

 

posted @ 2019-11-13 11:23  落叶无痕~  阅读(259)  评论(0编辑  收藏  举报