我正在通过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 + ".");
答案 0 :(得分:1)
不要使用全局变量。
如果您不必使用嵌套循环,请不要使用。
不要在数组中存储无用的东西。
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;
答案 1 :(得分:0)
第一个问题是您错过了结束}
。我认为你希望之前 return
语句。
其次,您的算法存在问题。您将dna1
(i
)中的每个项目与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
迭代第一个字符串,并将每个字母与第二个字符串中相应索引的字母进行比较。
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;