天天看點

大廠前端面試常考算法(持續更新)

基本都是力扣上的簡單題,有精力的話可以尋求更好的方法。以下題目都是筆者面大廠的親身經曆

快速排序(騰訊)

// 最基礎的方法,很直覺,還有更好的方法
function quickSort (arr) {
	if (arr.length <= 1) return arr // 遞歸判斷結束
    let index = Math.floor(arr.length / 2) // 取中間數索引
    let center = arr.splice(index, 1)[0] // 取索引對應元素并将其從原數組中删除
    let left = [], right = [] // 定義兩個數組(左&&右)
    for (let i = 0; i < arr.length; i++) {
    	// 周遊數組,若小于中間數則放入左數組,反之右數組
    	arr[i] < center ? left.push(arr[i]) : right.push(arr[i])
    }
    // 遞歸,将所有數組合并
    return quickSort(left).concat([center], quickSort(right))
}
           

爬樓梯(騰訊)

// 題目描述:假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
// 注意:給定 n 是一個正整數。

// 方法一:遞歸是可以的,不過時間複雜度有點高

// 方法二:動态規劃,簡單明了
var climbStairs = function (n) {
	let p = q = 0
	let result = 1
	for (let i = 1; i <= n; i++) {
		p = q
		q = result
		result = p + q
	}
	return result
}
           

兩數之和(阿裡)

// 題目描述:給定一個整數數組 nums 和一個整數目标值 target,請你在該數組中找出和為目标值的那兩個整數,并傳回它們的數組下标。

// 方法一:雙循環暴力枚舉,類似冒泡排序的思想,很容易想到,不建議

// 方法二:hash 表存值,一個for循環搞定
var twoSum = function (nums, target) {
	if (!nums) return []
	// 建立 Map 對象
	const m = new Map()
	for (let i = 0; i < nums.length; i++) {
		let key = nums[i] // 周遊數組項
		let val = target - nums[i] // 計算數組項比對的值
		// 如果 Map 對象裡有比對的值,傳回對應的“兩個”下标
		if (m.has(val)) return [m.get(val), i]
		m.set(key, i) // 否則存入該值
	}
}
           

字元串相加(騰訊)

// 題目描述:給定兩個字元串形式的非負整數 num1 和num2 ,計算它們的和。
var addStr = function (nums1, nums2) {
	let i = nums1.length - 1, j = nums2.length - 1
	let add = 0, arr = []
	while (i >= 0 || j >= 0 || add != 0) {
		let x = i >= 0 ? nums1.charAt(i) - 0 : 0
		let y = j >= 0 ? nums2.charAt(j) - 0 : 0
		let result = x + y + add
		arr.push(result % 10)
		add = result / 10
		i--
		j--
	}
	return add.reverse().join(" ")
}
           

字元串内部排序(騰訊)

// 題目描述:字元串排序,str = "aa a bee dd ee" => str = "a aa bee ee dd"

考官給的結果:return str.split(" ").sort().join(" ") // 感覺本意不像考算法
           

如果覺得對你有幫助的話,點個贊呗~

反正發文又不賺錢,交個朋友呗~

如需轉載,請注明出處foolBirdd