JavaScript算法面试题整理(持续更新)

1.数组转为树形结构

  let arr = [
        { id: "01", name: "张大大", pid: "", job: "项目经理" },
        { id: "02", name: "小亮", pid: "01", job: "产品leader" },
        { id: "03", name: "小丽", pid: "02", job: "产品经理" },
        { id: "04", name: "大光", pid: "02", job: "产品经理" },
      ]
  //方法一
  function toTree(arr) {
  	let parent = arr.filter(item => !item.pid)
  	let childs = arr.filter(item => item.pid)
	translate(parent , childs )
	function translate(parents,childs) {
		for(let i in parents) {
			parents[i].childs = []
			for(let j in childs) {
				if (parents[i].id === childs[j].pid) {
					parents[i].childs.push(childs[j])
					let list = JSON.parse(JSON.stringify(childs))
					list.slice(j, 1)
					translate([childs[j]], list)
				}
			}
		}
	}	
	return parent
  }
  // 方法二
  
function toTree(arr) {
	let res = [] 
	let map = {}
	arr.forEach(item => {
		map[item.id] = item
	}
	arr.forEach(item => {
		let parent = map[item.pid]
		if (parent) {
			parent.childs = parent.childs ? parent.childs.push(item) : parent.childs = [item]
		} else {
			res.push(item)
		}
	}
}

2.根据id查找tree中的节点和路径

let tree = {
  id: 1,
  name: "company",
  children: [
    {
      id: 2,
      name: "group1",
      children: [
        {
          id: 3,
          name: 'dept1'
        },
        {
          id: 5,
          name: 'dept2',
          children: [
            {
              id: 6,
              name: 'user1'
            }
          ]
        },
      ]
    },
    {
      id: 4,
      name: "gropu2"
    },
  ]
}

function getPathRoute (tree, id, path) {
	let arr = Array.isArray(tree) ? tree : [tree]
	if (!path) {
	    path = []
	  }
	for(let i in tree) {
		let tempPath = [...path]
		tempPath.push(arr[i].name)
		if (arr[i].id === id) {
			return tempPath
		} else {
			return getPathRoute(tree[i], id, tempPath)
		}
	}

}

3. 版本号排序

//输入:['1.45.0','1.5','6','3.3.3.3.3.3.3']

function vSort (arr) {
	arr.sort((a,b) => {
		let arr1 = a.split('.')
		let arr2 = b.split('.')
		for(let i in arr1) {
			let num1 = arr1[i]
			let num2 = arr2[i]
			if (num1 === underfined ||  num2 === underfined){
				return arr1.length - arr2.length
			}
			if (num2 === num1) continue
			return num1 - num2
		}
	})
}

4.两个大数相加

 // 10000000000 + 9999999999999 

function sumAdd (num1, num2) {
	if (num1.length < num2.length) {
		[num1, num2] = [num2, num1]
	}
	let [arr1, arr2] = [[...num1].reverse(), [...num2].reverse()]
	for(let i =0;i< arr1.length; i++) {
		if (arr2[i]) {
			arr1[i] =  Number.parseInt(arr1[i]) + Number.parseInt(arr2[i]) + num;
		} else {
			arr1[i] = Number.parseInt(arr1[i]) + num;
		}
		
		if (arr1[i] >= 10) {
			[arr1[i], num] = [arr1[i] % 10, 1];
		} else {
		 	num = 0;
		}
	}
	 // 如果最后进位为1,则结果前应加1为
    if (num === 1) {
        arr1[arr1.length] = num;
    }
     // 返回结果字符串
    return arr1.reverse().join('');
}

5. 层序遍历

function levelorder(root) {
	let quene = [root]
	let res = []
	while(quene.length) {
		let length = quene.length
		let arr = []
		for (let i = 0; i< length; i++) {
			let node = quene.shift()
			if (node.left) quene.push(node.left) 
			if (node.right) quene.push(node.right) 
			arr.push(node.value)
		}
		res.push(arr)
	}
	return res
}

6 . 比较两个对象相等

function deepDiff (obj1,  obj2) {
	let obj1keys = Object.keys(obj1)
    let obj2keys = Object.keys(obj2)
    if (obj1keys.length !==obj2keys.length) return false
    for(let i= 0; i< obj1keys.length ;i++) {
        let key = obj1keys[i]
        if (!obj2keys.includes(key)) return false;
        if (obj1[key] instanceof Object) {
            deepEqual(obj1[key], obj2[key])
        } else if(obj1[key] !== obj2[key]) return false
    }
    return true
}

7. 实现函数request,最多只能同时发送maxNum个http请求,所有请求结束之后调用callback

function request(urls, max, callback) {
	let reqNum = 0
	const run = () => {
		reqNum++
		let url = urls.shift()
		http(url).then.(res => {
			reqNum--
			if (urls.length && reqNum < max) {
				run()
			} else if (!urls.length && !reqNum) {
				callback()
			}
		})
	}
	if (urls.length > max) {
		for (let i = 0; i < max; i++) {
            run()
        }
	} else {
		for (let i = 0; i < urls.length; i++) {
            run()
        }
	}
}

8. 给定任意二维数组,输出所有的排列组合项。比如 [[‘A’,‘B’, ‘C’], [‘a’,‘b’, ‘c’], [1, 2]],输出 [‘Aa1’,‘Aa2’,‘Ab1’,‘Ab2’,‘Ba1’,‘Ba2’,‘Bb1’,‘Bb2’]

function merge (arr1, arr2) {
	let res = []
	for(let i = 0; i< arr1.length; i++) {
		for(let j = 0; i< arr2.length; j++) {
			res.push(arr1[i] + '' + arr2[j])
		}
	}
	return res
}

function getNewString(arr) {
	return arr.reduce((cur,next) => {
		return merge(cur,next)
	},[])
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值