
Rosalind编程问题之从蛋白序列推断可能的mRNA序列个数(并取余)。
Inferring mRNA from ProteinGiven: 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本道题的代码会在下篇给出。至于取余是否可能还有其他生物学意义,小编暂时没有头绪,欢迎各位大佬指点。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)