蓝桥杯算法训练_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%成功,就说明自己还是修炼不够,需要继续努力。从小处获取经验,慢慢积累,相信自己。

 

posted on 2017-08-12 15:08  宋田茹  阅读(298)  评论(0编辑  收藏  举报