题目:DNA序列排序
DNA序列由一序列的大写英文字母表示,如ABCDEF。紊乱程度表示组成DNA序列的字母按照由小到大的顺序进行排列程度,如ABC的紊乱程度比ACB小,因为它字母都是由小到大排序的。紊乱程度计算如下,以DNA序列DCEFB为例:DCEFB的紊乱程度为5,其中字母D右边的序列有2个小于它的字母C和B,字母C有1个小于它的字母B,同理,字母E和F分别有1个排序小于它的字母,紊乱程度=2+1+1+1=5。紊乱程度越大,排序越乱。
程序输入:
第1行输入m和n,其中m表示每一个DNA序列的长度,n表示一共有多少个DNA序列;第2到n行输入DNA序列,每一个DNA序列的长度都为m。m的取值范围为1-100,即DNA序列的长度不超过100,n的范围为1-50,表示最多有50个DNA序列。
结果输出:
按照DNA的紊乱程度由小到大进行排序,如果两个DNA序列的紊乱程度相同,则按照输入的顺序进行排序。
程序设计—(时间16ms,占用空间200k):
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 void qsort(int startIndex,int EndIndex,int *vector,string *values){ 7 int start=startIndex; 8 int end=EndIndex; 9 int currentValue = *(vector+start); 10 string currentStr = *(values+start); 11 while(start<end){ 12 while(start<end&&*(vector+end)>=currentValue){ 13 end--; 14 } 15 *(vector+start)=*(vector+end); 16 *(values+start)=*(values+end); 17 while(start<end&&*(vector+start)<=currentValue){ 18 start++; 19 } 20 *(vector+end)=*(vector+start); 21 *(values+end)=*(values+start); 22 } 23 *(vector+end)=currentValue; 24 *(values+end)=currentStr; 25 if(end-1>startIndex){ 26 qsort(startIndex,end-1,vector,values); 27 } 28 if(end+1<EndIndex) 29 { 30 qsort(end+1,EndIndex,vector,values); 31 } 32 } 33 34 int main() 35 { 36 char line[30]; 37 string str; 38 int *numOfLines=new int[0]; 39 int index=0; 40 int *values=new int[0]; 41 string *allStr=new string(); 42 int totalLine=1; 43 int leterNum=0; 44 cin>>leterNum>>totalLine; 45 numOfLines = new int[totalLine]; 46 allStr = new string[totalLine]; 47 values = new int[leterNum]; 48 while (index<totalLine) 49 { 50 cin>>line; 51 str = line; 52 *(allStr+index)=line; 53 int count=0; 54 for(int i=0;i<leterNum;i++){ 55 int l = line[i]-‘A‘; 56 *(values+i)=l; 57 for(int j=i-1;j>=0;j--){ 58 if(*(values+j)>*(values+i)){ 59 count++; 60 } 61 } 62 } 63 (*(numOfLines+index))=count; 64 index++; 65 } 66 qsort(0,totalLine-1,numOfLines,allStr); 67 for(int i=0;i<totalLine;i++){ 68 cout<<*(allStr+i)<<endl; 69 } 70 return 0; 71 }
1007是简单题,主要考察一些小细节,有几个需要注意的地方:
(1)数组和指针的问题(由于本人刚刚接触C++,在指针上确实花了一些时间)
数组的指针可以表示第一个元素的位置,然后通过++可以得到其他元素的指针。
如:int *pointer = new int[10];
新建一个10个元素的数组,pointer指向该数组第一个元素的地址,pointer++表示数组第二个元素的地址,pointer+i表示数组第pointer+i个元素。
(2)第二个是输入的问题
弄清楚几个输入的关键方法:
>>、getLine、gets、get_s、fget
时间: 2024-10-05 00:07:42