gpt4 book ai didi

javascript - 为什么全局数组声明会使测试失败?

转载 作者:行者123 更新时间:2023-12-04 07:40:17 24 4
gpt4 key购买 nike

我正在处理 LeetCode problem 438. Find All Anagrams in a String :

Given two strings s and p, return an array of all the start indices of p's anagrams in s. You may return the answer in any order.

s and p consist of lowercase English letters.


我的方法
我将每个字符的频率存储在一个数组中并使用滑动窗口。
1. 使用全局数组声明
let arr:number[]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // outside any function
function check(arr1:number[],arr2:number[]):boolean{
for (let i=0;i<26;i++){
if (arr1[i]!=arr2[i]){
return false;
}
}
return true;
}
function findAnagrams(s: string, p: string): number[] {
let ans:number[]=[],
lengthP:number=p.length,
lengthS:number=s.length,
j:number=0;
if (lengthP>lengthS){
return ans;
}
let arrP:number[]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for (let chr of p){
arrP[chr.charCodeAt(0)-97]++;
}
for (let i=0;i<lengthP;i++){
arr[s[i].charCodeAt(0)-97]++;
}
if (check(arr,arrP)){
ans.push(0);
}
for (let i=lengthP;i<lengthS;i++){
arr[s[j].charCodeAt(0)-97]--;
arr[s[i].charCodeAt(0)-97]++;
j++;
if (check(arr,arrP)){
ans.push(j);
}

}
return ans;
};
2. 使用函数作用域数组声明
function check(arr1:number[],arr2:number[]):boolean{
for (let i=0;i<26;i++){
if (arr1[i]!=arr2[i]){
return false;
}
}
return true;
}
function findAnagrams(s: string, p: string): number[] {
let arr:number[]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // inside function
let ans:number[]=[],
lengthP:number=p.length,
lengthS:number=s.length,
j:number=0;
if (lengthP>lengthS){
return ans;
}
let arrP:number[]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for (let chr of p){
arrP[chr.charCodeAt(0)-97]++;
}
for (let i=0;i<lengthP;i++){
arr[s[i].charCodeAt(0)-97]++;
}
if (check(arr,arrP)){
ans.push(0);
}
for (let i=lengthP;i<lengthS;i++){
arr[s[j].charCodeAt(0)-97]--;
arr[s[i].charCodeAt(0)-97]++;
j++;
if (check(arr,arrP)){
ans.push(j);
}

}
return ans;

};
问题
第一个在某些测试用例上给出了错误的答案,但第二个是 100% 正确的。
这真的是因为方式而发生的 arr被宣布?
如果是,那么我是否缺少有关 Typescript 中局部和全局声明的信息?
  • correct submission
  • wrong submission
  • 最佳答案

    使用全局数组的问题在于它会在 findAnagrams 的多次调用中持续存在。 .因此,虽然第一次调用会给出正确的结果,但第二次调用不会以零填充开始 arr ,但会建立在上一次调用的结果之上,这显然会导致计数不正确。
    这与 TypeScript 没有特别的关系——它在普通 JavaScript 中是一样的。
    您可以通过重置 arr 中的值来修复第一个版本。开头findAnagrams :

    arr.fill(0);
    但是将这样的变量保持在局部范围内是更好的做法。

    关于javascript - 为什么全局数组声明会使测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67516573/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com