JavaScript経典面接問題(一)
7480 ワード
一:記憶化フィボナッチ関数(Memoization)
テーマ:フィボナッチの数列は以下のような数列を指します.
fibonacci関数を完成してください.nをパラメータとして受け入れて、数列のn番目の数を取得できます.例えば、
テストプログラムはフィボナッチの数列を順番に取得します.タイムアウトしないように注意してください.グローバル変数を追加しないでください.
本題の出所:「JavaScript言語の精髄」
答え:
問題:extractistr関数を完成したら、1つの文字列の中のすべての文字列を解析できます.
(本題の出所:「JavaScript Cookbook」)答え:
テーマ:あるオブジェクトの深いレベルにアクセスする必要がありますが、このオブジェクトの属性が存在しないとエラーが発生します.
テーマ:オブジェクトのデータで長方形の位置とサイズを表します.
関数isOverlapを完成してください.二つの長方形をパラメータとして受け入れて、この二つの長方形がページ上で重なっているかどうかを判断します.たとえば:
テーマ:文字列に原型の方法spacifyを追加してください.文字列の各文字列にスペースの間隔を追加できます.
答え:
タイトル:現在は文字列データを保存する配列があります.
最後の結果は、「セレクション1」「アイテム1」「アイテム2」「アクション2」「アイテム3」「アイテム4」「アイテム5」です.
inject Sections関数を完成してください.上記の機能を達成できます.
題目:JavaScript generator関数を編纂し、数字だけを含む多次元配列を受諾して、一つのローズマリーを返します.撮影後の結果を遍歴できます.たとえば:
テーマ:isSameSet関数を完成しました.二つのSetオブジェクトをパラメータとして受け入れました.true/falseに戻ってください.この二つのセットの内容が完全に一致しているかどうか、例えば、
テーマ:関数unique(arr)を作成し、配列内の重複要素を除去する配列を返します.たとえば:
テーマ:highlight関数を完成してください.テンプレート文字列の挿入内容を置換して、ドキュメントを挿入してから赤い色を表示します.たとえば:
答え:css:
作者:いのりちゃん技術ブログ:https://www.jianshu.com/u/05f416aefbe1 90後のフロントエンドの妹は、プログラミングが好きで、運営が好きで、よく振り回されます.仕事の中で発生した技術問題を総括し、記録を堅持します.
テーマ:フィボナッチの数列は以下のような数列を指します.
1, 1, 2, 3, 5, 8, 13, ....
つまり、n番目の数は、数列の前の2つによって加算されます.f(n)=f(n-1)+f(n-2)fibonacci関数を完成してください.nをパラメータとして受け入れて、数列のn番目の数を取得できます.例えば、
fibonacci(1) // => 1
fibonacci(2) // => 1
fibonacci(3) // => 2
…テストプログラムはフィボナッチの数列を順番に取得します.タイムアウトしないように注意してください.グローバル変数を追加しないでください.
本題の出所:「JavaScript言語の精髄」
答え:
const fibonacci = ((memo = [0, 1]) => {
const fib = (n) => {
let result = memo[n]
if (typeof result !== "number") {
result = fib(n - 1) + fib(n - 2)
memo[n] = result
}
return result
}
return fib
})()
二:解析文字列問題:extractistr関数を完成したら、1つの文字列の中のすべての文字列を解析できます.
extractStr('My name is:Jerry. My age is:12.') // => ['Jerry', '12']
との間には含まれていません.つまり、もし:abc..,だったら[abc]に戻ります.(本題の出所:「JavaScript Cookbook」)答え:
const extractStr = (str) => {
const ret = str.match(/:([^:\.])*?\./g) || []
return ret.map((subStr) => subStr.replace(/[:\.]/g, ''))
}
三:safeGetテーマ:あるオブジェクトの深いレベルにアクセスする必要がありますが、このオブジェクトの属性が存在しないとエラーが発生します.
var data = { a: { b: { c: 'ScriptOJ' } } }
data.a.b.c // => scriptoj
data.a.b.c.d // => ,
console.log('ScriptOJ') // =>
safeGet関数を完成してください.無限多レベルのデータを安全に取得できます.データが存在しないとエラーが発生しません.undefinedに戻ります.var data = { a: { b: { c: 'ScriptOJ' } } }
safeGet(data, 'a.b.c') // => scriptoj
safeGet(data, 'a.b.c.d') // => undefined
safeGet(data, 'a.b.c.d.e.f.g') // => undefined
console.log('ScriptOJ') // => ScriptOJ
答え:const safeGet = (o, path) => {
try {
return path.split('.').reduce((o, k) => o[k], o)
} catch (e) {
return void 666
}
}
二つの長方形が重なっているかどうかを判断します.テーマ:オブジェクトのデータで長方形の位置とサイズを表します.
{
x: 100,
y: 100,
width: 150,
height: 250
}
幅150の高さ250の長方形がページ上の(100,100)位置を表しています.関数isOverlapを完成してください.二つの長方形をパラメータとして受け入れて、この二つの長方形がページ上で重なっているかどうかを判断します.たとえば:
const rect1 = { x: 100, y: 100, width: 100, height: 100 }
const rect2 = { x: 150, y: 150, width: 100, height: 100 }
isOverlap(rect1, rect2) // => true
答え:// :http://www.geeksforgeeks.org/find-two-rectangles-overlap/
const isOverlap = (rect1, rect2) => {
const l1 = { x: rect1.x, y: rect1.y }
const r1 = { x: rect1.x + rect1.width, y: rect1.y + rect1.height }
const l2 = { x: rect2.x, y: rect2.y }
const r2 = { x: rect2.x + rect2.width, y: rect2.y + rect2.height }
if (
l1.x > r2.x ||
l2.x > r1.x ||
l1.y > r2.y ||
l2.y > r1.y
) return false
return true
}
五:spacifyテーマ:文字列に原型の方法spacifyを追加してください.文字列の各文字列にスペースの間隔を追加できます.
"ScriptOJ".spacify() // => "S c r i p t O J"
(本題の出所:http://blog.sourcing.io/interview-questions)答え:
String.prototype.spacify = function () {
return this.split('').join(' ')
}
六:下付きで挿入するタイトル:現在は文字列データを保存する配列があります.
['item1', 'item2', 'item3', 'item4', 'item5']
別の行列があります.オブジェクトのセットを保存します.[
{ content: 'section1', index: 0 },
{ content: 'section2', index: 2 }
]
各オブジェクトは、元の配列のindex座標にcontentデータを挿入することを表します. 0 1 2 3 4
item1 itme2 item3 item4 item5
^ ^
| |
セレクション1最後の結果は、「セレクション1」「アイテム1」「アイテム2」「アクション2」「アイテム3」「アイテム4」「アイテム5」です.
inject Sections関数を完成してください.上記の機能を達成できます.
injectSections(
['item1', 'item2', 'item3', 'item4', 'item5'],
[
{ content: 'section1', index: 0 },
{ content: 'section2', index: 2 }
]
) // => ['section1', 'item1', 'item2', 'section2', 'item3', 'item4', 'item5']
答え:const injectSections = (items, sections) => {
/* map */
const sectionsMap = new Map(sections.map(({ index, content }) => [index, content]))
/* , push */
return items.reduce((ret, item, index) => {
/* push map , push map */
if (sectionsMap.has(index)) ret.push(sectionsMap.get(index))
/* push */
ret.push(item)
return ret
}, [])
}
七:配列平滑(二)題目:JavaScript generator関数を編纂し、数字だけを含む多次元配列を受諾して、一つのローズマリーを返します.撮影後の結果を遍歴できます.たとえば:
const numbers = flatten2([1, [[2], 3, 4], 5])
numbers.next().value // => 1
numbers.next().value // => 2
numbers.next().value // => 3
numbers.next().value // => 4
numbers.next().value // => 5
答え:function *flatten2(arr) {
for (let i = 0; i < arr.length; i++) {
const item = arr[i]
/* yield* */
Array.isArray(item) ? yield* flatten2(item) : yield item;
}
}
/* flatten2 flatten */
// const flatten = (arr) => [...flatten2(arr)]
二つのセットが同じかどうかを判断します.テーマ:isSameSet関数を完成しました.二つのSetオブジェクトをパラメータとして受け入れました.true/falseに戻ってください.この二つのセットの内容が完全に一致しているかどうか、例えば、
const a = {}
const b = 1
const c = 'ScriptOJ'
const set1 = new Set([a, b, c])
const set2 = new Set([a, c, b])
isSameSet(set1, set2) // => true
答え:/* sort, sort 。 Set
* 、 、 , ,
*
* :
* A = B A B B A 。
*
* 、map 。
*/
const isSameSet = (s1, s2) => {
/* , */
const isSame = (a, b) => {
const values = [...a]
for (let val of values) {
/* , */
if (!b.has(val)) return false
}
return true
}
/* a b,b a, */
return isSame(s1, s2) && isSame(s2, s1)
}
/* By */
// const isSameSet = (set1, set2) =>
// [...set1].every((o) => set2.has(o)) &&
// [...set2].every((o) => set1.has(o))
九:配列の重さテーマ:関数unique(arr)を作成し、配列内の重複要素を除去する配列を返します.たとえば:
unique([0, 1, 2, 2, 3, 3, 4]) // => [0, 1, 2, 3, 4]
unique([0, 1, '1', '1', 2]) // => [0, 1, '1', 2]
答え:const unique = (arr) => [...new Set(arr)]
十:フォントの強調関数テーマ:highlight関数を完成してください.テンプレート文字列の挿入内容を置換して、ドキュメントを挿入してから赤い色を表示します.たとえば:
const yourName = 'ScriptOJ'
const myName = 'Jerry'
document.body.innerHTML = highlight`Hello, ${yourName}. I am ${myName}.`
上記の例のページは次のように表示されます.0_1498033735172_upload-2abd65b1-1e98-46ba-b46f-df4188a036a5
highlight関数の作成を完了してください.答え:css:
.highlight {
color: red;
}
js:// Tagged template literals
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
const highlight = (strings, ...args) => {
return strings.reduce((str, cur, i) => {
return `${str}${cur}${args[i] ? `${args[i]}` : '' }`
}, '')
}
文章はネットから整理して、リンクを参考にします.https://scriptoj.com/problems?tag=JavaScript%E5%9F%BA%E7%A1%80 作者:いのりちゃん技術ブログ:https://www.jianshu.com/u/05f416aefbe1 90後のフロントエンドの妹は、プログラミングが好きで、運営が好きで、よく振り回されます.仕事の中で発生した技術問題を総括し、記録を堅持します.