Transitions and Transversions
Problem
For DNA strings s1 and s2 having the same length, their transition/transversion ratio R(s1,s2) is the ratio of the total number of transitions to the total number of transversions, where symbol substitutions are inferred from mismatched corresponding symbols as when calculating Hamming distance (see “Counting Point Mutations”).
Given: Two DNA strings s1 and s2 of equal length (at most 1 kbp).
Sample input:
>Rosalind_0209
GCAACGCACAACGAAAACCCTTAGGGACTGGATTATTTCGTGATCGTTGTAGTTATTGGA
AGTACGGGCATCAACCCAGTT
>Rosalind_2200
TTATCTGACAAAGAAAGCCGTCAACGGCTGGATAATTTCGCGATCGTGCTGGTTACTGGC
GGTACGAGTGTTCCTTTGGGT
Return: The transition/transversion ratio R(s1,s2).
Sample output:
1.21428571429
在DNA序列中经常发生点突变,也就是核苷酸的替换,主要的突变形式可以分为转换(transitions)和颠换(transversions)两类。转换代表嘌呤和嘌呤之间的替换,或嘧啶和嘧啶之间的替换。颠换代表嘌呤和嘧啶之间的替换,示意图如下。
本道题给出两条核苷酸序列,要求我们计算其转换(transitions)/颠换(transversions)的比例。
题目难度相对较为简单,代码如下:
package Rosalind;
import java.util.Scanner;
public class Transitions_and_Transversions {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入核酸序列1:");
String line1 = sc.nextLine();
Scanner cs = new Scanner(System.in);
System.out.println("请输入核酸序列2:");
String line2 = cs.nextLine();
float ratio = (float) (Math.round(counttransition(line1,line2)/(countMut(line1,line2)-counttransition(line1, line2)) * 1000000000)) / 1000000000;
System.out.println(ratio);
}
public static float countMut(String line1, String line2){
float mutation = 0;
for (int n =0; n< line1.length();n++){
if (line1.charAt(n)!=line2.charAt(n)){
mutation++;
}
}
return mutation;
}
public static float counttransition(String line1, String line2){
float transition = 0;
for (int n =0; n< line1.length();n++){
if (line1.charAt(n)=='A'&&line2.charAt(n)=='G'||line1.charAt(n)=='G'&&line2.charAt(n)=='A'){
transition++;
}else if (line1.charAt(n)=='C'&&line2.charAt(n)=='T'||line1.charAt(n)=='T'&&line2.charAt(n)=='C'){
transition++;
}
}
return transition;
}
}
值得注意的一点就是最后四舍五入求得最终比例的时候,要提前设定子方法返回值为float类型,不然后继需要经历繁琐的类型转化。此外,原题示例保留了11位小数,此代码保留了7位小数,不过将答案输入会Rosalind也会提示通过。