2019.11.21 作OJ題的反思

1.利用二分法查找數組元素(適用於有序數組)

  

 1 #include<stdio.h>
 2 int BinarySearch(int a[],int n,int key);
 3 int arr[2000050];
 4 
 5 int main(void)
 6 {
 7     int n,m,i;
 8     int num;
 9     
10     scanf("%d%d",&n,&m);
11     for(i=0;i<n;i++)
12     {
13         scanf("%d",&arr[i]);
14     }
15     for(i=1;i<=m;i++)
16     {
17         scanf("%d",&num);
18         printf("%d",BinarySearch(arr,n,num));
19          if(i==m) printf("\n");
20          else printf(" ");
21     }
22     return 0;
23 }
24 int BinarySearch(int a[],int n,int key)
25 {
26     int left=0,right=n-1;
27     int middle,i=0;
28     while(left<=right)
29     {
30         middle=(left+right)/2;
31         if(a[middle]>key)
32             right=middle-1;
33         if(a[middle]<key)
34             left=middle+1;
35         if(a[middle]==key)
36             return middle;
37     }
38     return -1;
39 }

 PS:對於二分法查找問題,主要是尋找key值所在的區域,逐步縮小查找的範圍,以提升查找效率。對於一些比較大的有序數組的時候,若是使用數組遍歷的方式,那麼效率肯定很低下了。如何縮小範圍,即利用left與right的從新賦值來達到目的。這種題目最好先本身演算一遍,找到查找的規律,從特殊到通常。數組

2.利用計數方法來解決簡單的括號匹配問題

 1 #include<stdio.h>
 2 int main(void)
 3 {
 4     char ch[105];
 5     int i=0;
 6     int count=0;
 7     int flag=1;
 8     
 9     scanf("%s",ch);
10     while(ch[i]!='\0')
11     {
12         if(ch[i]=='(') count++;
13         if(ch[i]==')'&&count==0)
14         {
15             printf("parentheses do not match!\n");
16             return 0;    
17         }
18         if(ch[i]==')'&&count!=0) count--;
19         i++;
20     }
21     if(count==0) 
22         printf("parentheses match!\n");
23     else
24         printf("parentheses do not match!\n");    
25         
26     return 0; 
27 }

 

 PS: 對於括號匹配問題,注意創建模型。何時是匹配成功,何時是匹配失敗。顯然最終左右括號數一定相等,且在字符串中,當左右括號數等的時候,一定是先出現左括號。因此依據此能夠創建兩個條件。spa

 

3.字符數組的使用

 1 #include<stdio.h>
 2 int main(void)
 3 {
 4     char ch[105];
 5     int arr[52];
 6     char ch1[52]={[0]='A',[26]='a'};
 7     int i=0,j=0;
 8 
 9     scanf("%s",ch);
10     for(j=0;j<52;j++)
11         arr[j]=0;
12     for(j=1;j<52;j++)
13     {    if(j<=25)
14             ch1[j]=ch1[j-1]+1;
15         if(j>=27) 
16             ch1[j]=ch1[j-1]+1;
17     }    
18     while(ch[i]!='\0')
19     {
20         if(ch[i]<='Z'&&ch[i]>='A')
21             arr[ch[i]-'A']++;
22         if(ch[i]<='z'&&ch[i]>='a')
23             arr[ch[i]-'A'-6]++;        
24         i++;
25     }
26     for(j=0;j<52;j++)
27     {
28         if(arr[j]!=0)
29             printf("The character %c has presented %d times.\n",ch1[j],arr[j]);
30     } 
31     
32     return 0; 
33 }

 

PS:在個人思路中,我忽略了大寫字母與小寫字母的ASCLL碼(美國信息交換標準代碼)之間還有一些表示符號。
code

  

 

 

 

     'Z'的ASCLL碼爲90,而'a'的ASCLL碼爲97,其中還有6個ASCLL碼錶示一些特殊符號。
blog

   這一特色使個人代碼在一開始時WA(wrong anwser)了,好坑~~~字符串

相關文章
相關標籤/搜索