常見算法題

1. reserve

讓數(shù)組反轉(zhuǎn)倒置

const arr = [1, 2, 3, 4, 5];
arr.reverse();
console.log(arr); // [5, 4, 3, 2, 1]
\color{#4A33EE}{面試題1. 用js模擬reserve}
const arr = [1, 2, 3, 4, 5];

function reverse(arr) {
  let l = 0;
  let r = arr.length - 1;
  while (l < r) {
    let temp = arr[l];
    arr[l] = arr[r];
    arr[r] = temp;
    l++;
    r--;
  }
}

reverse(arr);
console.log(arr); // [5, 4, 3, 2, 1]
\color{#4A33EE}{面試題2. 字符串反轉(zhuǎn)倒置}
let str = 'abcdef';
str = str
  .split('') // 拆分成數(shù)組
  .reverse() // 數(shù)組可以倒序
  .join(''); // 數(shù)組合并成字符串

console.log(str); // fedcba

2. 排序算法

面試最???快速排序和希爾算法 (tips)

算法名稱 時(shí)間復(fù)雜度 空間復(fù)雜度
冒泡排序 O(n2) O(1)
選擇排序 O(n2) O(1)
快速排序 O(n*log2n) O(log2n)~O(n)
插入排序 O(n2) O(1)
希爾排序 O O(1)
\color{#4A33EE}{1. 冒泡排序}

原理:如果是想從小到大排序,拿出數(shù)組相鄰兩位數(shù)比較,小的放前,大的放后,如此反復(fù)的交換位置就可以得到排序的效果。

function bubbleSort(arr) {  
    for(let i = 0,l=arr.length;i<l-1;i++) {
        for(let j = i+1;j<l;j++) {
          if(arr[i]>arr[j]) {
                let tem = arr[i];
                arr[i] = arr[j];
                arr[j] = tem;
            }
        }
    }
    return arr;
}

\color{#4A33EE}{2. 選擇排序}

原理:首先從原始數(shù)組中找到最小的元素,并把該元素放在數(shù)組的最前面,然后再從剩下的元素中尋找最小的元素,放在之前最小元素的后面,知道排序完畢。

function selectSort(arr){
    var len=arr.length;
    var minIndex,temp;
    for(i=0;i<len-1;i++){
        minIndex=i;
        for(j=i+1;j<len;j++){
            if(arr[j]<arr[minIndex]){
                minIndex=j;
            }
        }
    temp=arr[i];
    arr[i]=arr[minIndex];
    arr[minIndex]=temp;
    }
    return arr;
}

\color{#4A33EE}{3. 快速排序}

原理:從數(shù)組的中間拿一個(gè)值,然后通過這個(gè)值挨個(gè)和數(shù)組里面的值進(jìn)行比較,如果大于的放一邊,小于的放一邊,然后把這些合并,再進(jìn)行比較,如此反復(fù)即可。

function fastSort(arr){
    // 如果只有一位,就沒有必要比較
    if(arr.length<=1){
        return arr;
    }
    // 獲取中間值的索引
    var len = Math.floor(arr.length/2);
    // 截取中間值
    var cur = arr.splice(len,1);
    // 小于中間值放這里面
    var left = [];
    // 大于的放著里面
    var right = [];
    for(var i=0;i<arr.length;i++){
        // 判斷是否大于
        if(cur>arr[i]){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    // 通過遞歸,上一輪比較好的數(shù)組合并,并且再次進(jìn)行比較。
    return sortA(left).concat(cur,sortA(right));
}

\color{#4A33EE}{4. 插入排序}

原理:想象我們斗地主,摸排階段,手里的牌都按照從小到大排序。如果每摸一張牌,我們就把他插入合適的位置,使得它比后面位置的牌小,比前面位置的牌大或者相等。

function insert(arr) {
        for (var i = 1; i < arr.length; i++) {
            var key = arr[i];
            var j = i - 1;
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
        return arr;
}

\color{#4A33EE}{5. 希爾排序}

原理:希爾排序在插入排序的基礎(chǔ)上,將數(shù)據(jù)進(jìn)行了分組,將原有的數(shù)據(jù)分為若干個(gè)子集,然后對每個(gè)子集進(jìn)行排序,依次類推,不停地分割成子集,直到最后完全排序。

function shellSort(arr) {
    var len = arr.length,
        temp,
        gap = 1;
    while(gap < len/3) {          //動(dòng)態(tài)定義間隔序列
        gap = gap*3+1;
    }
    for (gap; gap > 0; gap = Math.floor(gap/3)) {
        for (var i = gap; i < len; i++) {
            temp = arr[i];
            for (var j = i-gap; j >= 0 && arr[j] > temp; j -= gap) {
                arr[j+gap] = arr[j];
            }
            arr[j+gap] = temp;
        }
    }
    return arr;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 求數(shù)組最大值和最小值之差 方法一:使用歸并方法reduce (ES5) API:array.reduce(f...
    番茄沙司a閱讀 1,278評論 1 1
  • 1、KMP算法 參考:july大神的KMP博客細(xì)節(jié)不擺,該算法由暴力字符串來匹配,具體是由字符串匹配的暴力寫法而來...
    Sawyer_liu閱讀 682評論 0 0
  • 一、題目描述 一個(gè)二維數(shù)組,滿足:每一行數(shù)字大小從左至右遞增,每一列從上至下遞增。求:一個(gè)函數(shù),其滿足輸入一個(gè)二維...
    如清晨的陽光閱讀 438評論 0 1
  • 1.對象轉(zhuǎn)換為數(shù)組 2.統(tǒng)計(jì)一個(gè)字符串出現(xiàn)最多的字母 3.找出下列正數(shù)組的最大差值 4.獲取數(shù)組中最大或者最小值 ...
    孫雪冬閱讀 301評論 0 0
  • 大家好,我叫劉浚睿,今天我的口頭作文,是《我最喜歡的季節(jié)》,我最喜歡的季節(jié)是冬天。冬天就到我的生日了,能有好吃的大...
    張會新閱讀 448評論 0 1

友情鏈接更多精彩內(nèi)容