專欄聲明:只求用最簡單的,容易理解的方法通過,不求優(yōu)化,不喜勿噴
2665. 計數(shù)器 II
題面
請你寫一個函數(shù) createCounter. 這個函數(shù)接收一個初始的整數(shù)值 init 并返回一個包含三個函數(shù)的對象。
這三個函數(shù)是:
increment() 將當前值加 1 并返回。
decrement() 將當前值減 1 并返回。
reset() 將當前值設(shè)置為 init 并返回。
知識點:
閉包
思路
編寫一個閉包保存我們的變量的當前數(shù)值,之后對于不同的操作對這個數(shù)據(jù)進行增減即可,注意 init 作為我們傳入的數(shù)值,也可以作為一個閉包中可以獲取和操作的數(shù)值
代碼
var createCounter = function(init) {
var now = init;
let increment = () => {
return ++now;
}
let decrement = () => {
return --now;
}
let reset = () => {
return now = init;
}
return {increment,decrement,reset }
};
/**
* const counter = createCounter(5)
* counter.increment(); // 6
* counter.reset(); // 5
* counter.decrement(); // 4
*/
2666. 只允許一次函數(shù)調(diào)用
題面
給定一個函數(shù) fn ,它返回一個新的函數(shù),返回的函數(shù)與原始函數(shù)完全相同,只不過它確保 fn 最多被調(diào)用一次。
第一次調(diào)用返回的函數(shù)時,它應該返回與 fn 相同的結(jié)果。
第一次后的每次調(diào)用,它應該返回 undefined 。
知識點:
閉包
思路
我們設(shè)定一個變量標識這個函數(shù)是不是運行過了,之后每次調(diào)用的時候判定,如果調(diào)用過了就返回 undefined ,否則返回函數(shù)的執(zhí)行結(jié)果即可
代碼
var once = function(fn) {
var first = 0;
return function(...args){
if(first == 0){
first++;
return fn(...args)
}else{
return undefined
}
}
};
2667. 創(chuàng)建 Hello World 函數(shù)
題面
請你編寫一個名為 createHelloWorld 的函數(shù)。它應該返回一個新的函數(shù),該函數(shù)總是返回 “Hello World” 。
知識點:
無
思路
返回 “Hello World” 即可,純?nèi)踔?/p>
代碼
var createHelloWorld = function() {
return function(...args) {
return "Hello World";
}
};
/**
* const f = createHelloWorld();
* f(); // "Hello World"
*/
2675. 將對象數(shù)組轉(zhuǎn)換為矩陣
題面
編寫一個函數(shù),將對象數(shù)組 arr 轉(zhuǎn)換為矩陣 m 。
arr 是一個由對象組成的數(shù)組或一個數(shù)組。數(shù)組中的每個項都可以包含深層嵌套的子數(shù)組和子對象。它還可以包含數(shù)字、字符串、布爾值和空值。
矩陣 m 的第一行應該是列名。如果沒有嵌套,列名是對象中的唯一鍵。如果存在嵌套,列名是對象中相應路徑,以點號 “.” 分隔。
剩余的每一行對應 arr 中的一個對象。矩陣中的每個值對應對象中的一個值。如果給定對象在給定列中沒有值,則應該包含空字符串 “” 。
矩陣中的列應按 字典升序 排列。
知識點:
深度優(yōu)先遍歷、set、哈希表
思路
dfs遞歸遍歷給出的對象,用一個 path 數(shù)組保存已經(jīng)經(jīng)過的路徑,方便生成 key
- 如果遇到的是基礎(chǔ)類型,直接把 key 和 value 進行保存
- 如果是數(shù)組類型,對數(shù)組的每一項進行dfs 遍歷,并將 index 放入路徑參數(shù)中
- 如果是對象類型,對對象的每個 key 進行 dfs 遍歷,并將 key 放入路徑參數(shù)中
遍歷完成后,遍歷每一行的 map,獲取所有的 key 的信息,之后重新遍歷我們每一行的map,對每個 key 獲取信息,生成我們需要的結(jié)果返回即可
代碼
type Value = string | number | boolean | null
function jsonToMatrix(arr: any[]): Value[][] {
const rows: Map<string, Value>[] = []
arr.forEach(item => {
const rowMap = new Map<string, Value>()
dfs(item, [], rowMap)
rows.push(rowMap)
})
const allKey = new Set<string>()
rows.forEach(mp => {
for (const key of mp.keys()) {
allKey.add(key)
}
})
const row0 = [...allKey].sort()
const res: Value[][] = Array(arr.length + 1)
res[0] = row0
for (let i = 1; i < res.length; i++) {
res[i] = Array(allKey.size).fill('')
for (let j = 0; j < row0.length; j++) {
const mp = rows[i - 1]
if (mp.has(row0[j])) {
res[i][j] = mp.get(row0[j])!
}
}
}
return res
function dfs(obj: any, path: string[], rowMap: Map<string, Value>): void {
if (!isObject(obj)) {
const key = path.join('.')
rowMap.set(key, obj)
return
}
if (Array.isArray(obj)) {
obj.forEach((item, index) => {
path.push(String(index))
dfs(item, path, rowMap)
path.pop()
})
}
Object.entries(obj).forEach(([key, val]) => {
path.push(key)
dfs(val, path, rowMap)
path.pop()
})
}
}
function isObject(val: unknown): val is object {
return typeof val === 'object' && val !== null
}
2676. 節(jié)流
題面
現(xiàn)給定一個函數(shù) fn 和一個以毫秒為單位的時間 t ,請你返回該函數(shù)的 節(jié)流 版本。
節(jié)流 函數(shù)首先立即被調(diào)用,然后在 t 毫秒的時間間隔內(nèi)不能再次執(zhí)行,但應該存儲最新的函數(shù)參數(shù),以便在延遲結(jié)束后使用這些參數(shù)調(diào)用 fn 。
知識點:
節(jié)流
思路
我們設(shè)定一個變量記錄我們上一輪的運行的時間,每當我們有新的任務(wù)調(diào)用時,如果它已經(jīng)比上一輪調(diào)用晚了 t 時間以上,我們直接運行這個任務(wù),然后記錄當前時間為上一輪運行時間;
如果我們當前任務(wù)還不能執(zhí)行,我們通過上一輪執(zhí)行時間和當前時間的差以及 t 的值算出它需要推遲多久,開始一個計數(shù)器,在這段時間后執(zhí)行我們的函數(shù),我們保存這個計時器,方便我們?nèi)∠?br> 每次開始計時器的時候,我們要取消已經(jīng)存在的計時器,也就是取消上一次的任務(wù),以便于每次都能執(zhí)行最新的任務(wù)。
代碼
var throttle = function (fn, t) {
let timer = null;
let mt = 0;
return function (...args) {
let now = Date.now();
if (now - mt > t) {
mt = now;
fn(...args)
}else{
clearTimeout(timer);
timer = setTimeout(() => {
mt += t ;
fn(...args)
}, t - now + mt)
}
}
};
/**
* const throttled = throttle(console.log, 100);
* throttled("log"); // logged immediately.
* throttled("log"); // logged at t=100ms.
*/
2677. 分塊數(shù)組
題面
給定一個數(shù)組 arr 和一個塊大小 size ,返回一個 分塊 的數(shù)組。分塊 的數(shù)組包含了 arr 中的原始元素,但是每個子數(shù)組的長度都是 size 。如果 arr.length 不能被 size 整除,那么最后一個子數(shù)組的長度可能小于 size 。
你可以假設(shè)該數(shù)組是 JSON.parse 的輸出結(jié)果。換句話說,它是有效的JSON。
請你在不使用 lodash 的函數(shù) _.chunk 的情況下解決這個問題。
知識點:
數(shù)組文章來源:http://www.zghlxwxcb.cn/news/detail-774878.html
思路
遍歷原數(shù)組,將元素依次放入臨時數(shù)組中,到達指定長度就將臨時數(shù)組放進我們的結(jié)果數(shù)組并且清空臨時數(shù)組,最后把剩下的元素(如果還有的話)一起放入結(jié)果數(shù)組,返回結(jié)果即可文章來源地址http://www.zghlxwxcb.cn/news/detail-774878.html
代碼
var chunk = function(arr, size) {
let re = [ ];
let t = [];
for(var i = 0;i< arr.length;i++){
if(t.length == size){
re.push([...t]);
t = [];
}
t.push(arr[i]);
}
if(t.length != 0){
re.push([...t]);
}
return re;
};
到了這里,關(guān)于leetcode — JavaScript專題(五):計數(shù)器 II、只允許一次函數(shù)調(diào)用、 創(chuàng)建 Hello World 函數(shù)、將對象數(shù)組轉(zhuǎn)換為矩陣、節(jié)流、分塊數(shù)組的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!