共计 5088 个字符,预计需要花费 13 分钟才能阅读完成。
薪资太低欲辞职,面试做题心甚难。
每每面试屡遇坎,每日一题快来看。
每日工作之余,我会将本人整顿的一些前端面试题口试题整顿成每日一题,而后在公众号中推送给大家,每天仅需几分钟做一道题,通过与日俱增,在换工作的时候肯定能让你拿到一个比拟好的offer
。明天这篇文章是我将近期每日一题中比拟好的题目及粉丝们分享的一些答案进行的整顿,分享给更多的掘友,心愿能够帮忙到你。同时关注公众号【前端有的玩】,每天早上八点四非常,准时推送每日一题。
题目一
题目
当初有小编每个月老婆给的零花钱清单,然而因为某些起因,有些月份没有零花钱,如下数据所示
// 一月,二月,五月的零花钱
{1:200, 2:140, 5:400}
请将下面的数据格式转换为[200, 140, null, null, 400, null, null, null, null, null, null, null]
, 其中数组的长度为12
,对应十二个月,请欠缺上面代码
const obj = {1: 200, 2: 140, 5: 400};
function translate(obj) {// 请在此处增加代码}
// 输入 [200, 140, null, null, 400, null, null, null, null, null, null, null]
console.log(translate(obj));
答案
这道题答案能够有许多中,以下列举了几个群友奉献的答案,为您提供参考
答案一
const obj = {1: 200, 2: 140, 5: 400};
function translate(obj) {return Array.from({ length: 12}).map((_, index) => obj[index + 1] || null);
}
// 输入 [200, 140, null, null, 400, null, null, null, null, null, null, null]
console.log(translate(obj));
答案二
const obj = {1: 200, 2: 140, 5: 400};
function translate(obj) {return Object.assign(Array(13).fill(null), obj).slice(1);
}
// 输入 [200, 140, null, null, 400, null, null, null, null, null, null, null]
console.log(translate(obj));
答案三
const obj = {1: 200, 2: 140, 5: 400};
function translate(obj) {
// 请在此处增加代码
let result = Array(12).fill(null)
Object.entries(obj).forEach(([key, value]) => {result[key - 1] = value;
});
return result;
}
// 输入 [200, 140, null, null, 400, null, null, null, null, null, null, null]
console.log(translate(obj));
题目二
题目
请输入 1
到400
之间所有数字中蕴含的 1 的个数,比方数字 1
中蕴含了一个 1
, 数字11
中蕴含了两个 1
, 数字20
中不蕴含 1
, 数字1
到21
中共蕴含了 13
个1
。
function getCount() {}
// 输入 180
console.log(getCount())
答案
答案一
这个答案比拟经典,性能也算是很不错的了
const sum1s = num => {
let numstr
if (!num) return 0
if (typeof num === 'string') numstr = num
else numstr = String(num)
if (Number(numstr) === 0) return 0
const curr =
numstr[0] > 1
? 10 ** (numstr.length - 1) +
numstr[0] * (numstr.length - 1) * 10 ** (numstr.length - 2)
: sum1s(10 ** (numstr.length - 1) - 1) + 1
return curr + sum1s(numstr.substr(1))
}
// 输入 180
console.log(sum1s(400))
答案二
这个用到了正则,不过对于长字符串正则可能性能会有点点差
function countOne(num){
// num 为正整数,办法有点儿暴力
return Array.from({length:num},(v,i)=>i+1).join('').replace(/[^1]/g,'').length
}
console.log(countOne(400))
答案三
上面这个答案算是中规中矩的答案了,将每一个数字转换为字符串而后统计 1
的个数
function getCount() {
let count = 0
for(let i=1;i<400;i++) {count = count + `${i}`.split('1').length - 1
}
return count
}
// 输入 180
console.log(getCount())
题目三
垂帘画阁画帘垂,谁系怀思怀系谁?影弄花枝花弄影,丝牵柳线柳牵丝。这是一首回文诗,即每一句诗正向反向读都是一样的。上面这道题是一道回文数字,即数字正向反向读都是一样的,比方 11
,1221
,2112
等等。
题目
请打印出 1 - 10000
之间的所有回文数字。其中1~9
因为只有一位数字,所以不算回文数字。
答案
答案一
const palindrome = length => {const res = []
const digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
const add = (current, length) => {if (length <= 1) return
digits.forEach(digit => {res.push(digit + current + digit)
add(digit + current + digit, length - 2)
})
}
digits.forEach(num => {add(num, length - 1)
res.push(num + num)
add(num + num, length - 2)
})
return res.filter(num => !num.startsWith('0'))
}
// 总共 189 个
console.log(palindrome(4))
答案二
function palindrome (max) {return Array(max + 1).fill('').reduce((a, c, i) => {if (i > 10) {const arr = Array.from(`${i}`)
const [x, y] = [`${i}`, arr.reverse().join('')]
x === y && a.push(i)
}
return a
}, [])
}
// 总共 189 个
console.log(palindrome(10000))
答案三
const result = [...Array(10000).keys()].filter((x) => x> 10 && x === Number(x.toString().split('').reverse().join('')) )
console.log(result)
题目四
题目
请实现上面代码中的函数 fn
, 使其能够输入指定id
对应的所有父 id
及其本身id
const data = [
{
id: 1,
name: '222',
children: [{
id: 2,
name: '34',
children: [{
id: 112,
name: '334',
}, {
id: 113,
name: '354',
}
]
}]
}
]
function fn(id) {
}
// 输入 [1, 2, 112]
console.log(fn(112))
答案
答案一
const data = [
{
id: 1,
name: '222',
children: [{
id: 2,
name: '34',
children: [{
id: 112,
name: '334',
}, {
id: 113,
name: '354',
}
]
}]
}
]
function fn(id) {const res = []
const find = _ => {if (!_) return
return _.find(item => (item.id === id || find(item.children)) && res.push(item.id))
}
find(data)
return res.reverse()}
console.log(fn(112))
答案二
const fn = (id, ancestors = [], current = data) => {for (let i = 0; i < current.length; i++) {if (current[i].id === id) return ancestors.concat(id)
if (current[i].children && current[i].children.length) {const ret = fn(id, ancestors.concat(current[i].id), current[i].children)
if (ret) return ret
}
}
}
console.log(fn(112))
答案三
function fn(id) {const arr = []
const getIds = (ids) => {for (const v of ids) {arr.push(v.id)
if (v.id === id) {return} else if (v.children) {getIds(v.children)
} else {arr.pop()
}
}
}
getIds(data)
return arr
}
console.log(fn(112))
题目五
题目
请实现函数,将 entry
转换为 output
的数据格式
const entry = {
'a.b.c.dd': 'abcdd',
'a.d.xx': 'adxx',
'a.e': 'ae'
}
// 要求转换成如下对象
const output = {
a: {
b: {
c: {dd: 'abcdd'}
},
d: {xx: 'adxx'},
e: 'ae'
}
答案
答案一
function transform(obj) {const res = {}
for (let [keys, value] of Object.entries(obj)) {
keys
.split('.')
.reduce((prev, cur, idx, arr) =>
prev[cur] = prev[cur] || (arr[idx + 1] ? {} : value)
, res)
}
return res
}
答案二
const transform = (input: { [P in string]: string }): Object => {const ret = {}
Object.entries(input).forEach(([keys, val]) => {
let root = ret
keys.split('.').forEach((key, ind, arr) => {if (ind === arr.length - 1) root[key] = val
else {root[key] = root[key] || {}
root = root[key]
}
})
})
return ret
}
答案三
const entry = {
'a.b.c.dd': 'abcdd',
'a.d.xx': 'adxx',
'a.e': 'ae',
}
const convert = (data) => {let res = {}
const entries = Object.entries(data)
for (let i = 0; i < entries.length; i++) {
let temp = res
let [key, value] = entries[i]
const everyOne = key.split('.')
for (let j = 0; j < everyOne.length; j++) {if (j === everyOne.length - 1) {temp[everyOne[j]] = value
}
temp[everyOne[j]] = temp[everyOne[j]] || {}
temp = temp[everyOne[j]]
}
}
return res
}
console.log(convert(entry))
总结
这次整顿的这些每日一题都是一些编程题,其中有些还是咱们日常开发中可能会遇到的问题,通过做这些题也能够测验一下本人对这些实用编程技巧的把握水平。每日一题来源于公众号【前端有的玩】,工作日每天早上八点四非常准时推送,每日一题,每天成长一点点。
结语
不要吹灭你的灵感和你的想象力; 不要成为你的模型的奴隶。——文森特・梵高