题目来源: LeetCode 75 30 天 JavaScript 挑战
思路
实现 Array.filter
代码
ts
type Fn = (n: number, i: number) => any
function filter(arr: number[], fn: Fn): number[] {
let res = []
for(let i = 0; i < arr.length; i++) {
if (fn(arr[i], i)) {
res.push(arr[i])
}
}
return res
};
思路
实现 Array.reduce
代码
ts
type Fn = (accum: number, curr: number) => number
function reduce(nums: number[], fn: Fn, init: number): number {
if (!nums.length) {
return init
}
let _init = init
for(let i = 0; i < nums.length; i++) {
_init = fn(_init, nums[i])
}
return _init
};
思路
首先计算初始窗口 [0,k] 中元音字母的个数,然后将窗口向右移动,判断窗口进入和移出的字母情况,是元音字母 count +1, 否则 -1,最后取 max 和 count 的较大值。
代码
ts
const isVowel = (c) => "aeiou".includes(c)
function maxVowels(s: string, k: number): number {
let i = 0
let max = 0
let count = 0
for (; i < k; i++) {
let cur = s[i]
if (isVowel(cur)) {
count++
}
}
max = Math.max(count, max)
for(; i < s.length; i++) {
let cur = s[i]
let last = s[i - k]
if (isVowel(cur)) {
count++
}
if (isVowel(last)) {
count--
}
max = Math.max(count, max)
}
return max
};
思路
双指针,找出一个最长的子数组,如果该子数组内最多允许有 K 个 0,这个数组长度就是最大连续 1 的个数。
代码
ts
function longestOnes(nums: number[], k: number): number {
let res = 0
let right = 0
let left = 0
let zeros = 0
while(right < nums.length) {
if (nums[right] === 0) {
zeros++
}
while(zeros > k) {
if (nums[left++] === 0) {
zeros--
}
}
res = Math.max(res, right - left + 1)
right++
}
return res
};
思路
双指针,判断指针内之和是否小于左右指针的差,如果小于就把左指针向右移动,最后返回右指针减去左指针再减一。
代码
ts
function longestSubarray(nums: number[]): number {
let res = 0
let left = 0
let right = 0
for (; right < nums.length; right++) {
res += nums[right]
if (res < right - left) {
res -= nums[left]
left++
}
}
return right - left - 1
};