zoukankan      html  css  js  c++  java
  • 蓝桥杯算法训练_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=='
    ')    break;
    25         num1[trans(a)]++;
    26     }    
    27     while(1)
    28     {
    29         scanf("%c",&a);
    30         if(a=='
    ')    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%成功,就说明自己还是修炼不够,需要继续努力。从小处获取经验,慢慢积累,相信自己。

  • 相关阅读:
    React-Native 基本环境的搭建
    initWithFrame 与 initWithCoder 、awakeFromNib 的方法理解笔记
    关于 jwTextFiled 的使用说明
    使用 SourceTree 遇到冲突的解决方法
    如何使用最简单的方法将一个已经存在的工程中使用 cocaPodfile
    使用 NSData 分类实现,对 NSData 数据类型进行 AES 加密
    相机检测
    纯代码适配优化方案之一(内联函数的使用)
    页面跳转问题,多次 push 到新的页面的问题的解决方法
    判断银行卡卡号输入的合法性接口
  • 原文地址:https://www.cnblogs.com/allein-STR/p/7350385.html
Copyright © 2011-2022 走看看