Rosalind Java|Inferring mRNA from Protein

Rosalind Java|Inferring mRNA from Protein,第1张

Rosalind编程问题之从蛋白序列推断可能的mRNA序列个数(并取余)。

Inferring mRNA from Protein

Given: A protein string of length at most 1000 aa.
Sample input:

MA

Return: The total number of different RNA strings from which the protein could have been translated, modulo 1,000,000. (Don’t neglect the importance of the stop codon in protein translation.)
Sample output:

12


题目大意很容易理解:给出一段蛋白质序列,求其可能的mRNA数量,并将其取余数(mod)。
实现思路如下:
1.获取整条蛋白质序列,并分别获得其单独的氨基酸字符。
2.单个氨基酸对应其mRNA密码子个数,并做累乘。
3.累乘完全部氨基酸对应mRNA密码子个数后,考虑3个终止密码子的影响。

下面是实现代码:

public class Inferring_mRNA_from_Protein {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入蛋白序列:");
        String protein = sc.nextLine();
        TransferRNA(protein);
    }

    //1.找到每个氨基酸对应的RNA密码子数量并进行累乘
    public static void TransferRNA(String protein) {
        int pn = 1;//初始值设定为1或者0都可,后面密码子检索时都会覆盖。
        long mRNAnum = 3;//终止密码子有三个
        for (int n = 0; n < protein.length(); n++) {
            switch (protein.charAt(n)) {
                case 'I':
                    pn = 3;
                    break;
                case 'M':
                    pn = 1;
                    break;
                case 'T':
                    pn = 4;
                    break;

                case 'N':
                    pn = 2;
                    break;
                case 'K':
                    pn = 2;
                    break;

                case 'S':
                    pn = 6;
                    break;

                case 'R':
                    pn = 6;
                    break;

                case 'L':
                    pn = 6;
                    break;

                case 'P':
                    pn = 4;
                    break;

                case 'H':
                    pn = 2;
                    break;

                case 'Q':
                    pn = 2;
                    break;

                case 'V':
                    pn = 4;
                    break;

                case 'A':
                    pn = 4;
                    break;

                case 'D':
                    pn = 2;
                    break;

                case 'E':
                    pn = 2;
                    break;

                case 'G':
                    pn = 4;
                    break;

                case 'F':
                    pn = 2;
                    break;


                case 'Y':
                    pn = 2;
                    break;
                case 'C':
                    pn = 2;
                    break;

                case 'W':
                    pn = 1;
                    break;
                default:
                    break;
            }
            mRNAnum *= pn;
            mRNAnum = mRNAnum % 1000000;
        }
        System.out.println(mRNAnum);
    }
}

为什么要取余数

在本道题的尾部,Rosalind留下了一个问题:在推断mRNA from Protein时为什么要取其余数。从计算内存占用容量角度来说,无论是int还是long类型变量,其存储范围都是有限的,不能无限累乘。但是由于我们拿到的蛋白质序列是非常长的,而每个氨基酸几乎都有多个密码子(除了甲硫氨酸等),这就使得累乘结果指数级增长,最终超出内存。因此在这里以一百万为界,取余可以等效为取出溢出的累乘数,节省计算资源。

不过在python中不会出现类似内存溢出的情况,但是取余依旧可以有效地节省计算资源,便于展示最终结果。python本道题的代码会在下篇给出。至于取余是否可能还有其他生物学意义,小编暂时没有头绪,欢迎各位大佬指点。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/794483.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-06
下一篇2022-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存