JavaScript 常見算法面試(一)

目錄

1.超過範圍的兩個大整數相加

2.實現數組扁平化

3.數組去重

4.求數組中的最大值/最小值

5.最大公約數、最小公倍數

6.反串單向鏈表

7.實現 indexOf() 方法

8.判斷迴文字符串

9.累加函數 reduce()

10.reduce() 實現 forEach、map、filter

11.設計任務隊列,分別在 1、3、4 秒後打印出 “1”, “2”, “3”

12.查找出現頻率最高的字符

13.爬樓梯(動態規劃)


1.超過範圍的兩個大整數相加

  • 主要思路:將數字轉換爲字符串,每個字符串按位相加
function bigNumberAdd(number1, number2) {
    let result = "", 
        carry = false; 
    number1 = number1.split("");
    number2 = number2.split("");
    while (number1.length || number2.length || carry) {
        carry += ~~number1.pop() + ~~number2.pop();
        result = carry % 10 + result;
        carry = carry > 9;
    }
    return result;
}
var sum = bigNumberAdd('1000', '500');
console.log(sum);

2.實現數組扁平化

  • 數組扁平化:將一個多維數組變爲一維數組,兩種方法:
  1. 遞歸:遍歷最外層數組的每一個元素,如果是數組,繼續遞歸執行;不是數組,放到最後的結果數組當中
  2. array.toString().split(",").map()
var arr = [1, [2, [3, 4]]]; // [1, 2, 3, 4]
// 1.遞歸
var result = [];
function flattern1(array) {
    for (var i = 0; i < array.length; i++) {
        if (Array.isArray(array[i])) {
            flattern1(array[i])
        } else {
            result.push(array[i])
        }}
    return result; // 
}
console.log(flattern1(arr));

// 2.array.toString().split(",").map()
function flattern2(array) {
    return array.toString().split(",").map(function(item) {
        return +item; 
    })
}
console.log(flattern2(arr)); 

3.數組去重

  1. indexOf()
  2. new Set()
function unique1(array) {
    if (!Array.isArray(array) || array.length <= 1) return;
    var result = [];
    array.forEach(function(item) {
        if (result.indexOf(item) === -1) {
            result.push(item);
        }
    })
    return result;
}

function unique2(array) {
    if (!Array.isArray(array) || array.length <= 1) return;
    return new Set(array);
}

4.求數組中的最大值/最小值

  • Math.max.apply(null,array)
  • Math.min.apply(null,array)
var arr = [6, 4, 1, 8, 2, 11, 23];
// 方法一:
console.log(Math.max.apply(null, arr)) // 23
console.log(Math.min.apply(null, arr)) // 1
// 方法二:
function getMax(array) {
    max = array[0]
    for (var i = 0; i < array.length; i++) {
        max = Math.max(array[0], array[i])
    }
    return max;
}

5.最大公約數、最小公倍數

  • 求最大公約數基本思想:輾轉相除,用大數除以小數,再用小數除以餘數,一直遞歸,直到餘數爲0
  • 求最小公倍數基本思想:兩數相乘,除以它們的最大公約數
function getMaxCommonDivisor(a, b) { // 求最大公約數
    if (b === 0)
        return a;
    return getMaxCommonDivisor(b, a % b);
}
function getMinCommonMultiple(a, b) { // 求最小公倍數
    return a * b / getMaxCommonDivisor(a, b);
}
var result = getMinCommonMultiple(6, 8)
console.log(result);

6.反串單向鏈表

  • 使用三個變量分別表示:當前節點、前節點、後節點
  • 從頭節點往後遍歷,先獲取下一個節點,然後將後節點設置爲前節點,循環
var reverseList = function(head) {
    if (!head || !head.next) return head;
    let pre = null; 
    let current = head;
    let next;
    while (current) { 
        next = current.next;
        current.next = pre; 
        pre = current; 
        current = next; 
    }
    return pre;
};

7.實現 indexOf() 方法

function indexFun(array, val) {
    if (!Array.isArray(array))
        return;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === val) {
            return i; 
        }}
    return -1; 
}

8.判斷迴文字符串

  • 原理:判斷翻轉後的字符串和原來的字符串是否相同
function isPalindrome(str) {
    let reg = /[\W_]/g,
        newStr = str.replace(reg, "").toLowerCase(),
        reverseStr = newStr.split("").reverse().join("");
    return reverseStr === newStr;
}

9.累加函數 reduce()

  • 剩餘參數:...args 以...爲前綴,是個數組
  • reduce() 方法:接收一個函數作爲累加器,數組中的每個元素都要執行該函數
  • arr.reduce(function(上次函數返回值,當前要處理的值){},第一次調用時作爲上次函數返回值的值)​​​​​​​
function sum(...args) {
    var result;
    result = args.reduce((pre, item) => pre + item);
    return result;
}
// 剩餘參數包含:沒有對應形參的實參
// arguments包含:傳給函數的所有實參

10.reduce() 實現 forEach、map、filter

// 使用 reduce 方法實現 forEach、map、filter
// forEach 遍歷,處理
function forEachUseReduce(array, handler) {
    array.reduce(function(pre, item, index) {
        handler(item, index); 
    });}
// map 遍歷,處理,返回結果
function mapUseReduce(array, handler) {
    let result = [];
    array.reduce(function(pre, item, index) {
        let mapItem = handler(item, index);
        result.push(mapItem);
    });
    return result;
}
// filter 遍歷,滿足條件的處理,返回結果
function filterUseReduce(array, handler) {
    let result = [];
    array.reduce(function(pre, item, index) {
        if (handler(item, index)) { 
            result.push(item);
        }});
    return result;
}

11.設計任務隊列,分別在 1、3、4 秒後打印出 “1”, “2”, “3”

async function one() {
    setTimeout(function() {
        console.log(1);
    }, 1000);}
async function two() {
    setTimeout(function() {
        console.log(2);
    }, 3000);}
async function three() {
    setTimeout(function() {
        console.log(3);
    }, 4000);}
async function run() {
    var p1 = await one();
    var p2 = await two();
    var p3 = await three();
}
run(); 

12.查找出現頻率最高的字符

  • 遍歷字符串,把字符串作爲對象屬性
  • 判斷對象是否存在該屬性,若存在則屬性值累加,若不存在則屬性值設爲1
  • 遍歷對象,尋找最大的屬性值(字符出現次數),屬性名(出現字符)
function getStrMax(str) {
    let obj = {};
    for (let i = 0; i < str.length; i++) {
        if (obj[str.charAt(i)]) {
            obj[str.charAt(i)]++;
        } else {
            obj[str.charAt(i)] = 1;
        }}
    let max = 0;
    let maxstr;
    for (let key in obj) {
        if (max < obj[key]) {
            max = obj[key]
            maxstr = key
        }}
    console.log(maxstr + '出現了' + max + '次');
}

13.爬樓梯(動態規劃)

  • 由分析可知,假設只差最後一步就能走上第10級階梯,這個時候一共有兩種情況​​​​​​​
  • 因爲每一步只允許走1級或2級階梯, 因此分別爲從8級階梯和從9九級階梯走上去的情況​​​​​​​
  • 從0到10級階梯的走法數量 = 從0到9級階梯的走法數量 + 從0到8級階梯的走法數量​​​​​​​
  • 依次類推,可以得到遞歸關係,結束的標誌:從0到1級階梯的走法數量 + 從0到2級階梯的走法數量​​​​​​​
function getClimbingWays1(n) {
    if (n < 1) {
        return 0;
    }
    if (n === 1) { 
        return 1;
    }
    if (n === 2) { 
        return 2; 
    }
    return getClimbingWays1(n - 1) + getClimbingWays1(n - 2);
}

let map = new Map(); 
function getClimbingWays2(n) {
    if (n < 1) {
        return 0;
    }
    if (n === 1) {
        return 1;
    }
    if (n === 2) {
        return 2;
    }
    if (map.has(n)) { 
        return map.get(n); 
    } else {
        let value = getClimbingWays2(n - 1) + getClimbingWays2(n - 2);
        map.set(n, value); 
        return value; 
    }}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章