面试下来几道算法题记录一下
爬楼梯
如果每次上楼梯是1步或者2步,那么走完整个台阶有多少中走法
//整个算法的本质是一个斐那波契数列,也就是说从第三项开始永远是前两项的和
function fun1(n) {
if (n == 1 || n == 2) return n //如果台阶只有1或者2阶梯那就只有这两种走法
let sum = 0
let num1 = 1
let num2 = 2
for (let i = 3; i <= n; i++) {
sum = num1 + num2
num1 = num2
num2 = sum
}
return sum
}
找出最长回文子
找出字符串中最长回文子,也就是正着和反着读都一样,例如’上海人海上’
function strHu(s) {
if (s == '' || s.length < 2) {//如果是空或者长度小于2就直接返回本身
return s
}
if (s.split('').reverse().join('') === s) {//如果反转后直接相等也直接返回本身
return s
}
let start = 0 //定义一个起始值
let maxIndex = 1 //定义一个最大长度
function fun(left, right) {
while (left >= 0 && right < s.length && s[left] === s[right]) {
if (right - left + 1 > maxIndex) {
maxIndex = right - left + 1
start = left
}
left--
right++
}
}
for (let i = 0; i < s.length; i++) {
fun(i - 1, i + 1)//奇数对比
fun(i, i + 1)//偶数对比
}
return s.substring(start, start + maxIndex)//从起始值开始截取到最大长度的位置
}
找出arr中相加==target的元素并返回的他们的下标例如[1,3,5,7] 4 返回[0,1]
function toTargetIndex(arr, target) {
let map = new Map()
let newArr = undefined
for (let i = 0; i < arr.length; i++) {
if (map.has(target - arr[i])) {
newArr = [map.get(target - arr[i]), i]
} else {
map.set(arr[i], i)
}
}
return newArr
}
树结构扁平化
function treeToArr(tree, pName) {
let arr = []
for (const item of tree) {
item.name = pName ? pName + '-' + item.name : item.name
let { children, ...i } = item
if (children && children.length) {
arr.push(...treeToArr(children, item.name))
}
arr.push(i)
}
return arr
}