【数字马力校招前端笔试】六道大题,三小时,个人题解
探花考试系统,时间三小时,六道大题,考 js 知识、算法、vue/react 框架用法难度的话,只要你想到了它要考什么就简单,没想到就无法动笔题目:给一个字符串,循环输出每一个字符,当输出到最后一个字符时再从头开始思路:根据打印情况,猜想需要返回一个函数,考点也就在闭包上(当时还思考了迭代器、函数柯里化两个知识点)function loopString(s) {let i = 0return fu
·
探花考试系统,时间三小时,六道大题,考 js 知识、算法、vue/react 框架用法
难度的话,只要你想到了它要考什么就简单,没想到就无法动笔
- 题目:给一个字符串,循环输出每一个字符,当输出到最后一个字符时再从头开始
- 思路:根据打印情况,猜想需要返回一个函数,考点也就在闭包上(当时还思考了迭代器、函数柯里化两个知识点)
function loopString(s) {
let i = 0
return function () {
if (i === s.length) i = 0
let res = s[i]
i++
return res
}
}
const bar = loopString('bar');
console.log(bar(), bar(), bar(), bar()); // 'b' 'a' 'r' 'b'
- 题目:给一个数,判断该数是否是斐波那契数列里的一项,若是则返回第几项,若不是则返回-1
- 思路:考算法,递归可能是最先被想到,其实动态规划也简单,我习惯使用,只要维护两个数,两数之和即是下一位数,一直反复推出后面的数字即可
function findFibonacciIndex(n) {
let a = 1, b = 1, sum = 0, index = 1
while (sum < n) {
sum = a + b
a = b
b = sum
index++
}
return sum === n ? index : -1
}
console.log(findFibonacciIndex(5)); // 4
- 题目:实现链式的加减乘除(myCalculator(1).add(12).minus(3).multi(10).div(5).getValue() === 25)
- 思路:链式,按
.
调用方法,联想到类的知识点,因为实例调用类中的方法就是按.
调用的,调用完后再返回this
,也就相当于计算完后,又把实例返回了,可以继续调用方法
function myCalculator(num) {
// todo
class Cal {
constructor(val) {
this.value = val
}
getValue() {
return this.value
}
// 加法
add(newVal) {
this.value = this.value + newVal
return this
}
// 减法
minus(newVal) {
this.value = this.value - newVal
return this
}
// 乘法
multi(newVal) {
this.value = this.value * newVal
return this
}
// 除法
div(newVal) {
this.value = this.value / newVal
return this
}
}
const obj = new Cal(num)
return obj
}
console.log(myCalculator(121).add(1).minus(2)); // 120
- 题目:搜索多个文件夹路径(字符串数组,例如
['/usr/bin', '/etc/config']
),查找是否有公共路径,若有则返回公共路径(字符串),否则返回 null - 思路:类似于搜索字符串的公共前缀,那么双循环就可以搞定,但是得对数组处理一下,因为路径里包含了 ‘/’ 需要除去,所以返回答案时还要还原回来
function findParentDirectory(paths) {
// write your code here ...
let arr = []
// 把 paths 处理为二维数组赋值给 arr
paths.forEach(ele => {
let a = ele.split('/')
a.shift()
arr.push(a)
});
let res = []
for (let i = 0; i < arr[0].length; i++) {
let isTrue = true
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j][i] !== arr[j + 1][i]) {
isTrue = false
break
}
}
isTrue && res.push(arr[0][i])
}
if (res.length) {
return '/' + res.join('/')
} else {
return null
}
}
console.log(findParentDirectory(['/home/usr/vue', '/home/usr/react']));
// '/home/usr'
- 题目:若
a * a + b * b === c * c
,则称'a,b,c'
为勾股数,找出比 n 小的所有勾股数 - 思路:三循环暴力求解,暂时没想到更好的方法,先感谢各位观众给出更好的方法了(评论区已有大佬给出一种双指针的解法了)
function gougu(n) {
let arr = []
// 最小的勾股数从 3 开始
for (let a = 3; a <= n; a++) {
for (let b = a + 1; b <= n; b++) {
for (let c = b + 1; c <= n; c++) {
if (a * a + b * b === c * c) {
arr.push(`${a},${b},${c}`)
}
}
}
}
return arr
}
console.log(gougu(10)); //
- 题目:用 vue、react 分别实现同一个功能,框架实战,用定时器可以搞定,异步请求我直接用的 Promise 对象, 不确定是否正确
如果觉得对你有帮助的话,点个赞呗~
反正发文又不赚钱,交个朋友呗~
如需转载,请注明出处foolBirdd
更多推荐
已为社区贡献3条内容
所有评论(0)