Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么全局数组声明会导致测试失败?_Javascript_Arrays_Typescript - Fatal编程技术网

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);