腾讯前端面试题笔试
虽然已经有了offer,但还是很有幸的受邀参加腾讯前端的面试,很幸运,遇到一位很nice的大佬面试官,很有耐心的和我唠了很久,面试是用的腾讯会议远程,聊了很多,也向他请教了不少,前后加起来有4个小时了,是我经历的最长的一次面试了,下面是笔试部分的两道题,在这里记录下,分享给大家
1. 写代码用原生JS实现一个类似百度搜索框的自动完成控件,比如候选结果集arr=[‘aaa’, ‘abc’, ‘acc’, ‘dda’,…]; 用户输入’a’,下拉列表会出现以字母a开头的项’aaa’, ‘abc’, ‘acc’。要求,鼠标或键盘可以选中候选结果到输入框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>1</title>
<style>
.li:hover{
background-color: green;
}
</style>
</head>
<body>
<div id="wrap">
<input id="input" type="text" value="" oninput="inputChange(this)">
<ul id="list"></ul>
</div>
</body>
<script>
let arr = ['aaa', 'abc', 'acc', 'dda','agc', 'dds','ana', 'rbc', 'hgc', 'dfa','ass', 'dys']
let ul = document.getElementById("list")
let input = document.getElementById("input")
let result = []
let active = 0
// 输入时
function inputChange(e) {
// get value
if (e.value === '') {
ul.innerHTML = ""
return
}
result = arr.filter(function(item){
return item[0] == e.value[0]
})
// remove
ul.innerHTML = ""
//add
result.map(function(val,index){
let li = document.createElement('li')
li.innerHTML = val
li.style.backgroundColor = 'white'
li.setAttribute('class','li')
// key words
if (index === active) {
li.style.backgroundColor = 'green'
}
// click
li.addEventListener('click',function(){
input.value = val
})
ul.appendChild(li)
})
}
//
input.addEventListener('keydown',function(key){
if (result.length > 0) {
if (key.keyCode ===38 && active > 0) {
active -= 1
input.value = result[active]
}else if (key.keyCode ===40 && active < result.length-1) {
active += 1
input.value = result[active]
}
//
let lis = ul.getElementsByClassName('li')
for (let index = 0; index < result.length; index++) {
const element = lis[index];
element.style.backgroundColor = 'white'
if (index === active) {
element.style.backgroundColor = 'green'
}
}
}
})
</script>
</html>
2. 实现超出整数存储范围的两个大正整数相加 function add(a, b) 。注意:参数 a 和 b 以及函数的返回值都是字符串。
// 2 数字转字符,按位相加
function add(a,b){
let result = "" // 保存结果
// 转数组
number1 = a.split("")
number2 = b.split("")
// 进位结果
car = false
// length -> 0 && 进位结束 结束循环
while( number1.length || number2.length || car ){
//每一次将最后数字进行相加
car += ~~number1.pop() + ~~number2.pop()
// 取加法完的个位 进最终结果
result = car % 10 + result
// 进位判断
car = car > 9
}
// 返回
return result + ''
}
第一道题比较综合,我选择第二道题先快速解决,再慢慢调第一道题,最后还是都完成了,答案都是自己写的,有错误的望指正
再次感谢面试官大佬的耐心交流,比技术更美的是心灵美