騰訊前端初試

鄭明遠發表於2019-03-20

昨天面試的,有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題做出一些,之後還有一些問題,答了大部分,最後還是沒過。

總感覺我還是差了一些,但又很難發現差距在哪。要是能多和同屆校招的人交流一下就好了,總是自己一個人就容易陷入這種困境。

相關文章