基本都是力扣上的簡單題,有精力的話可以尋求更好的方法。以下題目都是筆者面大廠的親身經曆
快速排序(騰訊)
// 最基礎的方法,很直覺,還有更好的方法
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