目錄
10.reduce() 實現 forEach、map、filter
11.設計任務隊列,分別在 1、3、4 秒後打印出 “1”, “2”, “3”
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.實現數組扁平化
- 數組扁平化:將一個多維數組變爲一維數組,兩種方法:
- 遞歸:遍歷最外層數組的每一個元素,如果是數組,繼續遞歸執行;不是數組,放到最後的結果數組當中
- 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.數組去重
- indexOf()
- 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; }}
JavaScript 常見算法面試(一)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.