第一道大题:补充代码
DNA中有A、C、G、T等基因单元,ACGT算是在单词表中的正常顺序,而CA,GA,GC,TA,TC,TG算是逆序对,给你一个基因序列,即包含A、C、G、T的字符串数组,求出逆序对的个数。
在做以前的面试题的时候做过一道求逆序对并且排序的题,因此这个题目应该要比上一个要简单。
思路:从后往前扫描序列,这里只有ACGT四中情况,因此题目中给出的使用的是switch case如果不是补充代码的话估计我也想不到这样做。如果是A那么前面的序列中除了A以外的CGT都是逆序。C的话是GT,G的话是T,T没有逆序。这样一趟扫描后便可以统计出来逆序对的数量,刚开始的时候还是有点小迷糊的就在于:
假设是A的情况那么,序列中非A的字母的数量怎么统计出来的?
一开始我也想不明白,这里使用了一个数组来arr[]保存ACGT的数量,count来记录逆序对的数量。
case A:
count = count +arr[1] +
arr[2] + arr[3];
break;
case B;
arr[1]++;
count = count + arr[2] + arr[3];
break;
现在应该就明白了吧,其实arr是在不断更新的,因此可以在O(n)内完成。具体的代码如下:
public static int inversionPairsCount(String str)
{
int countFinal=0;
int arr[]=new int[4];
Arrays.fill(arr, 0);
int len=str.length();
int i=0;
char ch;
while(i<len)
{
ch=str.charAt(i);
i++;
switch (ch) {
case 'A':
{
<span style="color:#ff0000;">---------------------------------------- //1</span>
<span style="color:#ff0000;">countFinal=countFinal+arr[1]+arr[2]+arr[3];</span>
}
break;
case 'C':
{
<span style="color:#ff0000;">arr[1]++;
countFinal = countFinal+arr[2]+arr[3];</span>
}
break;
case 'G':
{
<span style="color: rgb(255, 0, 0); font-family: Arial;">arr[2]++;</span>
<span style="color: rgb(255, 0, 0); font-family: Arial;"><span style="white-space:pre"> </span> countFinal=countFinal+arr[3];</span>
<span style="color:#ff0000;"> </span>
}
break;
case 'T':
<span style="color:#ff0000;">arr[3]++;</span>
<span style="white-space:pre"> </span><span style="color:#cc0000;">-------------------------------//2</span>
break;
}
}
return countFinal;
}
其中红线部分为让补充的部分,很不幸的是有两处我没写上来,分别是注释出来的1和2处,因为感觉不到要写什么了。后来从网上搜索了一下有人写的是arr[0]++,但是这里countFinal 和arr[0]没关系,写了多余。至于第二处确实不知道了。