我不认为这是全局变量的问题,因为重复的bot建议,因为当我编辑错误的代码并将计数器变量放在for循环内时,会给出相同的错误输出。
我试图编写一个函数,该函数计算输入单词/字符出现的实例数。
测试数据为:
1个输入(查找(“快速的棕色狐狸”,“ fox”)),输出(“发现狐狸1次”)
2个输入(找到('aa,bb,cc,dd,aa','aa')),输出(“ aa被发现2次”)
我曾尝试解决过两次,第一次是“发现fox被发现是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的答案?
最佳答案
第一次尝试时遇到两个问题,请参见下面的(固定)代码中的注释
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)
。关于javascript - 在JavaScript中将变量放在for循环内而不是外部的意义何在?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36046874/