您的位置:首页 > 其它

蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数

2017-08-15 22:18 435 查看
今天做了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%成功,就说明自己还是修炼不够,需要继续努力。从小处获取经验,慢慢积累,相信自己。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: