使用两个for循环来比较两个字符串

时间:2017-01-07 17:42:13

标签: javascript

我正在通过exerciseism.io进行练习,第三个要求我们比较两个DNA字符串并返回它们之间的差异(汉明距离)。

例如:

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^

在该比较中排列了7个不同的字符。我的问题是我是否采取正确的方法来解决这个问题。我创建了两个空数组,创建了一个循环遍历两个字符串的函数,并在它们相遇时推送不同的字母。

我尝试通过控制台运行它,我总是遇到意外的输入错误。

    var diff = [];
    var same = [];
    function ham(dna1, dna2) {
      for (var i = 0; i < dna1.length; i++)
      for (var j = 0; j < dna2.length; i++){
        if (dna1[i] !== dna2[j]) {
          console.log(dna1[i]);
          diff.push(dna1[i]);
        }
        else {
          console.log(dna1[i]);
          same.push(dna1[i]);
        }
      return diff.length;
    }

    ham("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT");
    console.log("The Hamming distance between both DNA types is " +                 diff.length + ".");

7 个答案:

答案 0 :(得分:1)

不要使用全局变量。

如果您不必使用嵌套循环,请不要使用。

不要在数组中存储无用的东西。

&#13;
&#13;
function ham(dna1, dna2) {
  if (dna1.length !== dna2.length) throw new Error("Strings have different length.");
  var diff = 0;
  for (var i = 0; i < dna1.length; ++i) {
    if (dna1[i] !== dna2[i]) {
      ++diff;
    }
  }
  return diff;
}
var diff = ham("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT");
console.log("The Hamming distance between both DNA types is " + diff + ".");
&#13;
&#13;
&#13;

答案 1 :(得分:0)

第一个问题是您错过了结束}。我认为你希望之前 return语句。

其次,您的算法存在问题。您将dna1i)中的每个项目与dna2中的每个项目进行比较,而不是将项目保存在同一位置。

要使用较短的示例,以便我们可以逐步完成,请考虑比较“CAT”和“CBT”。您想比较每个字符串中相同位置的字符。所以你实际上并不想要2 for个循环,你只需要1.你要比较C到C([0]),A到B([1])和T到T ([2])在[1]找到1个差异。现在,通过你脑中的2个for循环逐步完成,你会发现你将获得比存在更多的差异。

一旦你对每个字符串中的字符使用相同的偏移量进行比较,你就必须担心一个字符串可能比另一个短。如果您尝试在字符串末尾使用偏移量,则会出现错误。因此我们也必须考虑到这一点,并假设将字符串长度之间的差异计算为差异。但也许这超出了您的范围,并且字符串将始终相同。

答案 2 :(得分:0)

您只需要有一个如下所示的循环:

var diff = [];
var same = [];

function ham(dna1, dna2) {
  for (var i = 0; i < dna1.length; i++) {
    if (dna1[i] !== dna2[i]) {
      console.log("not same");
      diff.push(dna1[i]);
    } else {
      console.log("same");
      same.push(dna1[i]);
    }


  }


  return diff.length;
}

ham("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT");
console.log("The Hamming distance between both DNA types is " + diff.length + ".");

答案 3 :(得分:0)

编辑距离并不是很难计算。需要更多代码来覆盖参数值中的边缘情况。

function hamming(str1, str2) {
    var i, len, distance = 0;

    // argument validity check
    if (typeof str1 === "undefined" || typeof str2 === "undefined") return;
    if (str1 === null || str2 === null) return;

    // all other argument types are assumed to be meant as strings
    str1 = str1.toString();
    str2 = str2.toString();

    // the longer string governs the maximum edit distance
    len = str1.length > str2.length ? str1.length : str2.length;

    // now we can compare
    for (i = 0; i < len; i++) {
        if ( !(str1[i] === str2[i]) ) distance++;
    }

    return distance;
}

答案 4 :(得分:0)

执行功能:

ham( "GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT" );

以下函数定义:

function ham(A,B){
   var D = [], i = 0;
   i = A.length > B.length ? A : B; 

   for( var x in i)
      A[x] == B[x] ? D.push(" ") : D.push("^");

   console.log( A + "\n" + B +"\n" + D.join("") );
}

将输出以下日志:

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^ 

能够接收不同长度的字符串,这取决于要求,并且可以修改数据表示比较以用足够的标准符号填充空白等。

演示:

ham("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT");

function ham(A, B) {
  var D = [],
    i = 0;
  i = A.length > B.length ? A : B;

  for (var x in i)
    A[x] == B[x] ? D.push(" ") : D.push("^");

  console.log(A + "\n" + B + "\n" + D.join(""));
};

答案 5 :(得分:0)

我认为你会想做这样的事情:

var dna1 = "GAGCCTACTAACGGGAT";
var dna2 = "CATCGTAATGACGGCCT";
function ham(string1, string2) {
var counter = 0;
for (i = 0;i < string1.length;i++) {
if (string1.slice(i, i + 1) != string2.slice(i, i + 1)) {
counter++
};
};
return(counter);
};
console.log("insert text here " + ham(dna1, dna2));

它会根据另一个字符串的相应字符检查字符串的每个字符,并在2个字符不相等时将1加到计数器中。

答案 6 :(得分:0)

您可以使用Array#reduce使用Function#call迭代第一个字符串,并将每个字母与第二个字符串中相应索引的字母进行比较。

&#13;
&#13;
function ham(dna1, dna2) {
  return [].reduce.call(dna1, function(count, l, i) {
    return l !== dna2[i] ? count + 1 : count;
  }, 0);
}

var diff =ham("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT");
console.log("The Hamming distance between both DNA types is " + diff + ".");
&#13;
&#13;
&#13;