Rosalind Java| Transitions and Transversions

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也会提示通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值