薪資過低欲辭職,面試作題心甚難。javascript
屢屢面試屢遇坎,每日一題快來看。前端
每日工做之餘,我會將本身整理的一些前端面試題筆試題整理成每日一題,而後在公衆號中推送給你們,天天僅需幾分鐘作一道題,通過日積月累,在換工做的時候必定能讓你拿到一個比較好的offer
。今天這篇文章是我將近期每日一題中比較好的題目及粉絲們分享的一些答案進行的整理,分享給更多的掘友,但願能夠幫助到你。同時關注公衆號【前端有的玩】,天天早上八點四十分,準時推送每日一題。java
如今有小編每月老婆給的零花錢清單,可是由於某些緣由,有些月份沒有零花錢,以下數據所示git
// 一月,二月, 五月的零花錢
{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())
複製代碼
這個答案比較經典,性能也算是很不錯的了markdown
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))
複製代碼
此次整理的這些每日一題都是一些編程題,其中有些仍是咱們平常開發中可能會遇到的問題,經過作這些題也能夠檢驗一下本身對這些實用編程技巧的掌握程度。每日一題來源於公衆號【前端有的玩】,工做日天天早上八點四十分準時推送,每日一題,天天成長一點點。
不要吹滅你的靈感和你的想象力; 不要成爲你的模型的奴隸。 ——文森特・梵高