Javascript 为什么全局数组声明会导致测试失败?
我正在研究: 给定两个字符串Javascript 为什么全局数组声明会导致测试失败?,javascript,arrays,typescript,Javascript,Arrays,Typescript,我正在研究: 给定两个字符串s和p,返回s中p字谜的所有起始索引数组。您可以按任意顺序返回答案 s和p由小写英文字母组成 我的方法 我将每个字符的频率存储在一个数组中,并使用滑动窗口 1.使用全局数组声明 让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];//在任何功能之外 函数检查(arr1:number[],arr2:number[]):布尔值{ 对于(设i=0;i长度){ 返回ans; } 设arrP:number[
s
和p
,返回s
中p
字谜的所有起始索引数组。您可以按任意顺序返回答案
s
和p
由小写英文字母组成
我的方法
我将每个字符的频率存储在一个数组中,并使用滑动窗口
1.使用全局数组声明
让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];//在任何功能之外
函数检查(arr1:number[],arr2:number[]):布尔值{
对于(设i=0;i长度){
返回ans;
}
设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];
for(让chr of p){
arrP[chr.charCodeAt(0)-97]+;
}
对于(设i=0;i使用全局数组的问题是,它将在多个findAnagrams
调用中持续存在。因此,虽然第一个调用将给出正确的结果,但第二个调用不会以零填充的arr
开始,而是基于前一个调用的结果,这显然会导致错误的计数
这与TypeScript没有特别的关系——在普通JavaScript中也是如此
您可以通过重置findAnagrams
开头的arr
中的值来修复第一个版本:
arr.fill(0);
但最好的做法是将这样一个变量保持在局部范围内
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;
};
arr.fill(0);