前端算法学习-前篇

递归

JavaScript中允许函数递归调用,示例:

      function factorial(n){
          if( n === 1){
            return 1
          }else{
            return n*factorial(n-1)
          }
      }
    
    console.log(factorial(6))

当一个函数呗递归调用时,递归没有完成,函数的计算结果会被暂时挂起,
上例的执行过程如下:

6 * factoial(5)
6 * 5 * factoial(4)
6 * 5 * 4 * factoial(3)
6 * 5 * 4 * 3 * factoial(2)
6 * 5 * 4 * 3 * 2 * factoial(1)

数组

定义:一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字。
数组的第一项下标是0
创建一个数组

let array = []

该数组的长度为0,

array.length // 0

也可以通过调用构造函数来创建数组

let array1 = new Array()

数组的读写

可以使用[]操作符将数据赋值给数组,将1~100的数字赋给一个数组 示例如下:

let num = []
for(let i = 0;i<100;i++){
  num[i] = i +1
}

可以读取数组中的元素

let num = [1,2,3,4,5,6,7]
console.log(num[4]) // 5

数组的常用方法:

  • indexOf()函数用来查找传进来的参数是否在目标数组中存在,如果存在就返回下标,如果不存在就返回-1
// indexOf()
let names = ["zhangsan","lisi"]
console.log(names.indexOf("zhangsan")) // 0
console.log(names.indexOf("wangwu")) // -1
  • join()和toString()方法可以将数组转成字符串
let names = ["zhangsan","lisi"]
let str1 = names.join()
console.log(str1) // zhangsan,lisi
let str2 = names.toString()
console.log(str2) // zhangsan,lisi
// 两个方法不同的是 join()方法可以传递参数,参数的意义是使用该参数链接数组的各个元素
let str3 = names.join("-")
console.log(str3) // zhangsan-lisi
  • concat() 该方法可以合并多个数组 创建一个新数组
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [7,8]
let newArr = arr1.concat(arr2,arr3)
console.log(newArr) // [1,2,3,4,5,6,7,8]
  • splice()方法可以从现有数组里截取一个新数组,该方法的第一个参数是截取的起始索引,第二个参数是截取的长度, 第三个参数是添加的元素
let arr = [1,2,3,4,5,6,7,8]
let arr1 = arr.splice(2,3)
console.log(arr1) // [3,4,5]
console.log(arr) // [1,2,6,7,8]
  • push() 该方法用于向数组尾部中添加元素
let arr = [1,2,3]
arr.push(4)
console.log(arr) // [1,2,3,4]
  • unshift()该方法用于向数组开头添加元素
let arr = [1,2,3]
arr.unshift(4)
console.log(arr) // [4,1,2,3]
  • pop() 方法用于删除数组尾部的元素
let arr = [1,2,3]
arr.pop()
console.log(arr) // [1,2]
  • reverse()该方法可以将数组翻转
let arr = [1,2,3]
arr.reverse()
console.log(arr) // [3,2,1]
  • sort() 该方法用于数组的排序
let arr = [1,2,8,4,5,7,89,32,5]
arr.sort((a,b)=> a-b)
console.log(arr) // [1, 2, 4, 5, 5, 7, 8, 32, 89]
  • forEach()该方法接受一个函数作为参数,对数组中的每一个元素使用该方法
let arr =  [1, 2, 4, 5, 5, 7, 8, 32, 89]
arr.forEach((item)=>{
  console.log(item)
})
// 打印数组的每一项
  • every()方法接受一个返回值为布尔值的函数,对数组中的每个元素使用该函数,如果对于所有元素该方法都返回true,该方法就返回true,否则返回false
let arr =  [1, 2, 4, 5, 5, 7, 8, 32, 89]
let result = arr.every((item)=>{
    return  item > 0
})
console.log(result) // true
  • some() 方法接受一个返回值为布尔值的函数,只要有一个元素使得该函数为true,该方法就返回true
let arr =  [1, 2, 4, 5, 5, 7, 8, 32, 89]
let result = arr.some((item)=>{
    return  item > 5
})
console.log(result) // true
  • reduce() 方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和数组中的后续元素调用该函数,知道数组的最后一个元素,最后返回累加值.(对数组求和)
let arr =  [1, 2, 4, 5, 5, 7, 8, 32, 89]
const result = arr.reduce((pre,next) =>pre+next,0)
console.log(result) // 153
  • map()该方法和forEach类似,map和forEach方法不能跳出循环,for of可以

  • filter()该方法接受一个函数,对数组的每一个元素调用该函数,返回一个新的数组,不改变原数组。起到对原数组进行过滤的作用

let arr =  [1, 2, 4, 5, 5, 7, 8, 32, 89]
let arrNew = arr.filter((item)=>item > 5)
console.log(arrNew) // [7, 8, 32, 89]

冒泡排序

  function sort(arr){
      for(let i = 0; i < arr.length; i++){
          for(let j = 0; j < arr.length - i -1; j++){
              if(arr[j] > arr[j + 1]){
                const temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
              }
          }
      }
      return arr
  }


// 冒泡排序优化
function sort(arr){
      for(let i = 0; i < arr.length; i++){
          let isGo = false
          for(let j = 0; j < arr.length - i -1; j++){
              if(arr[j] > arr[j + 1]){
                isGo = true
                const temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
              }
          }
          if(!isGo) break;
      }
      return arr
  }

快速排序

function quickSort(arr){
    if(arr.length < 2) return arr
    const leftArr = [];
    const rightArr = [];
    const middleIndex = arr.length / 2;
    const middle = arr.splice(middleIndex, 1)[0];
    arr.map(item=>{
        if(middle > item){
          leftArr.push(item)
        }else{
          rightArr.push(item)
        }
    })

    return [...quickSort(leftArr), ...quickSort(rightArr)]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355