将变量放在for循环中而不是在JavaScript外部有什么意义?

时间:2016-03-16 21:03:49

标签: javascript

我不认为这是全局局部变量的问题,因为重复的机器人建议,因为当我编辑错误的代码并将计数器变量放在for循环中时,给出了相同的错误输出。

我正在尝试编写一个函数来计算输入字/字符出现的实例数。

测试数据是:

1-输入(找('快速棕狐','狐狸')),输出(“狐狸被发现1次”)

2-输入(找('aa,bb,cc,dd,aa','aa')),输出(“aa被发现2次”)

我试图解决它两次,第一次输出“狐狸被发现6.333333次”,第二次解决方案输出“狐狸被发现1次”。

我尝试的两种方法之间的区别在于最终输出计数器的位置和使用的语法。

第一次尝试:

function find(str,key){ 
var count = 0;
var answer = 0;
    for (var i = 0; i<str.length; i++){ 
        if (str[i] == key[0] ){
            for (var j = i; j<i +str.length; j++){
                if (str[j] == key[j-i]){ 
                    count = count + 1;
                }       
            }
        }
    }

    answer = (count)/(key.length);
    return key + "was found " + answer + "times";

}

第二次尝试:

function find(str,key){ 
var count = 0;
var answer = 0;
    for (var i = 0; i<str.length; i++){ 

        if (str[i] == key[0] ){ 

            for (var j = i; j<i +str.length; j++){    

                if (str[j] == key[j-i]){  
                    count = count + 1;
                }

                if (count == key.length){answer = answer + 1;}
            }
        }
    }
    return key + "was found " + answer + "times";
}

我不确定为什么第一个不起作用,我的代码中发生了什么,得到的答案是6.3333而不是1?

3 个答案:

答案 0 :(得分:1)

首次尝试时遇到两个问题,请参阅下面(固定)代码中的注释

function find(str,key){ 
    var count = 0;
    var answer = 0;
    for (var i = 0; i<str.length; i++){ 
        if (str[i] == key[0] ){
            for (var j = i; j<str.length; j++){  // you have to stop at end of "str"!
                if (str[j] == key[j-i]){ 
                    count = count + 1;
                }
                else {
                    break; // no match, you have to restart at beginning of "key"
                }       
            }
        }
    }

    answer = (count)/(key.length);
    return key + "was found " + answer + "times";

}

请注意,您的第二个版本可能会修复第三个问题(可能因为其中存在错误)。问题是部分匹配应该计为零而不是n/key.length(@TheGreatContini在评论中提供了一个示例)。

虽然我们在这里,但这是第二个修复

function find(str,key){ 
    var count = 0;
    var answer = 0;
    for (var i = 0; i<str.length; i++){ 

        if (str[i] == key[0] ){ 

            for (var j = i; j<str.length; j++){ // same problem here

                if (str[j] == key[j-i]){  
                    count = count + 1;
                }
                else { 
                    count = 0;
                    break; // you have to restart
                }

                if (count == key.length){
                     count = 0;   // a new beginning
                     answer = answer + 1;
                 }
            }
        }
    }
    return key + "was found " + answer + "times";
}

PS 作为奖励,here是一种更有效的字符串匹配算法 - O(str.length)而不是O(str.length*key.length)

答案 1 :(得分:1)

您在第一个示例中将key计数除以key.length,这就是为什么您得到一个十进制值(19/3 = 6.333,其中19是输入的长度)。第二个例子只增加答案,因此它是一个整数值。

答案 2 :(得分:1)

每次执行for j循环时,都需要将count初始化为0。

新循环是新单词比较的开始。如果计数达到单词的全长,则只增加答案。所以你总是需要一个if (count == key.length){answer = answer + 1;}

顺便说一句,您的for i循环不应该达到str.length,而是从中减去key.length