蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天做了4個簡單的題,題目雖然是簡單,但是對于我這樣的小白,還是有很多東西需要學習的。
2的次冪表示
上面就是題目,題目說的也很清晰了,接下來就是遞歸的實現:
1 #include<iostream> 2 using namespace std; 3 void puts(int n) 4 { 5 int i=0,num=0; 6 int a[20] = {0}; 7 while(1) 8 { 9 if(n==0) break; 10 int temp = n%2; 11 if(temp!=0) 12 { 13 a[num] = i; 14 num++; 15 } 16 i++; 17 n = n/2; 18 } 19 for(i = num-1; i >= 0; i--) 20 { 21 if(a[i]==0) 22 { 23 cout<<"2(0)"; 24 } 25 else if(a[i]==1) 26 { 27 cout<<"2"; 28 } 29 else if(a[i]>=2) 30 { 31 cout<<"2("; 32 puts(a[i]); 33 cout<<")"; 34 } 35 if(i!=0) 36 { 37 cout<<"+"; 38 } 39 } 40 41 } 42 int main() 43 { 44 int n; 45 cin>>n; 46 puts(n); 47 return 0; 48 }關鍵是找到應該在哪里遞歸。
前綴表達式
我們之前說到過后綴表達式,實際上,前綴表達式更符合計算機運算規則。
1 #include<iostream> 2 using namespace std; 3 void add(int a,int b) 4 { 5 cout<<a+b; 6 } 7 void sub(int a,int b) 8 { 9 cout<<a-b; 10 } 11 void mul(int a,int b) 12 { 13 cout<<a*b; 14 } 15 void div(int a,int b) 16 { 17 cout<<a/b; 18 } 19 int main() 20 { 21 char a; 22 int b,c; 23 cin>>a>>b>>c; 24 switch(a) 25 { 26 case '+': 27 add(b,c); 28 break; 29 case '-': 30 sub(b,c); 31 break; 32 case '*': 33 mul(b,c); 34 break; 35 case '/': 36 div(b,c); 37 break; 38 default: 39 break; 40 } 41 return 0; 42 }Anagrams問題
看到這個問題的時候,首先想到了之前學長教過的,要充分利用下標,最多有26個英文字母。我們開創兩個數組,分別存放兩個字符串,將英文字母在字母表中的順序對應數組的下標,是個很不錯的選擇。
但是我第一次寫的時候,使用的是char型數組,一個一個讀入,最后發現運行超時,改用字符串讀入方法,問題就得以解決了,這就提示我,以后遇到字符串問題,優先考慮字符串處理。
代碼如下:
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 int trans(char a) 5 { 6 if(a>='a'&&a<='z') 7 { 8 return a-'a'; 9 } 10 if(a>='A'&&a<='Z') 11 { 12 return a-'A'; 13 } 14 } 15 int main() 16 { 17 int num1[26]={0}; 18 int num2[26] = {0}; 19 int flag = 0; 20 char a[81],b[81]; 21 /* while(1) 22 { 23 scanf("%c",&a); 24 if(a=='\n') break; 25 num1[trans(a)]++; 26 } 27 while(1) 28 { 29 scanf("%c",&a); 30 if(a=='\n') break; 31 num2[trans(a)]++; 32 } */ 33 cin>>a; 34 cin>>b; 35 36 for(int i = 0; i < strlen(a); i++) 37 { 38 num1[trans(a[i])]++; 39 } 40 for(int i = 0; i < strlen(b); i++) 41 { 42 num2[trans(b[i])]++; 43 } 44 for(int i = 0; i < 26; i++) 45 { 46 if(num1[i]!=num2[i]) 47 { 48 flag = 1; 49 cout<<"N"; 50 break; 51 } 52 } 53 if(flag==0) 54 cout<<"Y"; 55 return 0; 56 }在主函數中有一點注釋部分,這就是最初使用的方法。
出現次數最多的整數
設計兩個數組,一個存放的就是輸入的數據,另一個存放的是對應出現的次數。這里就需要考慮一下,有的數字重復出現,怎么樣才能使其實現計數,并且將兩個數組實現一一對應。
代碼如下:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int num[20] = {0};//存放每個數字 6 int sum[20] = {0};//存放每個數字的個數 7 int n; 8 int i = 0; 9 int j = 0; 10 cin>>n; 11 for(i = 0; i < n; i++) 12 { 13 cin>>num[i]; 14 if(num[i]==num[i-1]) 15 { 16 sum[j-1]++; 17 j--; 18 } 19 j++; 20 } 21 if(j!=0) 22 { 23 int max = 0; 24 for(int j = 0; j < i; j++) 25 { 26 if(sum[j]<sum[j+1]) 27 { 28 max = j+1; 29 } 30 } 31 cout<<num[max]; 32 return 0; 33 } 34 }關鍵是這里:
?
?
【感想】簡單題雖然稱之為簡單題,但是還是需要練習,絕對不能眼高手低,沒有一次100%成功,就說明自己還是修煉不夠,需要繼續努力。從小處獲取經驗,慢慢積累,相信自己。
?
總結
以上是生活随笔為你收集整理的蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯_算法训练_表达式计算
- 下一篇: 蓝桥杯_算法训练_字串统计