腾讯前端初试

昨天面试的,有3道题,还问了一些基本问题,说下题目吧。

大数相加

实现2个大正整数相加 function add(a, b)

这里我们用字符串模拟一下相加运算就好了:

let a = '1'
let b = '999'

function add(a, b) {
  // 字符串拆成数组
  a = a.split('')
  b = b.split('')
  
  const alen = a.length
  const blen = b.length
  const maxLen = Math.max(alen, blen) + 1
  
  // 补0对齐
  for (let i = 0; i < maxLen - alen; i++) a.unshift('0')
  for (let i = 0; i < maxLen - blen; i++) b.unshift('0')
  const res = []
  
  // 模拟加法
  for (let i = maxLen - 1; i > 0; i--) {
    let sum = Number(a[i]) + Number(b[i])
    if (sum > 9) {
      sum %= 10
      a[i - 1] = String(Number(a[i - 1]) + 1)
    }
    res.push(sum)
  }
  
  if (a[0] !== '0') res.push(a[0])
  return res.reverse().join('')
}

console.log(add(a, b))
复制代码

input autocomplete效果

页面内有一个input输入框,实现在数组arr查询命中词和autocomplete效果(类似百度搜索框)

<input id="in" type="text" />
<ul id="ul"></ul>


const arr = ['123', '234', 'cbvg', 'gdcbg', 'kldjfg']

const ul = document.querySelector('#ul')
const input = document.querySelector('#in')

function removeAllChild() {
  while (ul.firstChild) {
    ul.removeChild(ul.firstChild)
  }
}

function assignment() {
  input.value = this.innerText
}

function checkedChild(str) {
  arr.forEach(v => {
    if (v.indexOf(str) !== -1) {
      const li = document.createElement('li')
      li.appendChild(document.createTextNode(v))
      li.addEventListener('click', assignment)
      ul.appendChild(li)
    }
  })
}

input.addEventListener('keyup', e => {
  removeAllChild()
  checkedChild(input.value)
})
复制代码

拖拽和放下

页面内有一个正方形元素,实现对其拖拽和放下

html,
body {
  margin: 0;
}
#demo {
  width: 100px;
  height: 100px;
  background-color: #fcc;
  position: relative;
}
#demo:hover {
  cursor: move;
}

<div id="demo"></div>
复制代码
//获取元素
var el = document.getElementById('demo')
var x = 0
var y = 0
var l = 0
var t = 0
var isDown = false
//鼠标按下事件
el.onmousedown = function(e) {
  //获取x坐标和y坐标
  x = e.clientX
  y = e.clientY

  //获取左部和顶部的偏移量
  l = el.offsetLeft
  t = el.offsetTop
  //开关打开
  isDown = true
}
//鼠标移动
window.onmousemove = function(e) {
  if (isDown == false) {
    return
  }
  //获取x和y
  var nx = e.clientX
  var ny = e.clientY
  //计算移动后的左偏移量和顶部的偏移量
  var nl = nx - (x - l)
  var nt = ny - (y - t)

  el.style.left = nl + 'px'
  el.style.top = nt + 'px'
}
//鼠标抬起事件
el.onmouseup = function() {
  //开关关闭
  isDown = false
}
复制代码

1题做的还行,2题 3题选一个就好,我2题做出一些,之后还有一些问题,答了大部分,最后还是没过。

总感觉我还是差了一些,但又很难发现差距在哪。要是能多和同届校招的人交流一下就好了,总是自己一个人就容易陷入这种困境。

转载于:https://juejin.im/post/5c90ac91e51d45285210b4c9

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值