分类
电子学会等级考试

二级复习重点

二级对题目的分析能力要求更高了,语法要掌握一维数组、二维数组、字符数组、结构体、函数的使用,算法技巧要熟练掌数组的遍历、打擂台求最值、数组计数法、冒泡排序、简单的结构体排序

打字员

考察字符数组的遍历,分析题目得到大小写切换对结果的影响。

#include<iostream>
using namespace std;
int n,t;
string s;
int main(){
    cin>>n;
    while(n--){
        cin>>s;
        t=0;  //每个字符串敲打次数重新开始计算
        t+=s.size(); 
        if(s[0]<='Z'&&s[0]>='A') t++;  //判断首字母大写,因默认小写 
        for(int i=1;i<=s.size()-1;i++){  //判断相邻两项是否有大小写切换 
            if(s[i]<='Z'&&s[i]>='A'&& s[i-1]<='z'&&s[i-1]>='a') t++;
            if(s[i]<='z'&&s[i]>='a'&& s[i-1]<='Z'&&s[i-1]>='A') t++;
        }
        cout<<t<<endl;
    }
    return 0;
}

字符串中最长的连续出现的字符 

分析题目得到每一个连续字符结束的标志是a[i]!=a[i-1]

解法一:求得每个位置的连续字符长度,打擂台

#include<iostream> 
#include<cstring> 
using namespace std;
char a[210],mc;
int b[210],mx=0;
int main(){
    cin>>a;
    int len=strlen(a);
    b[0]=1; //第一个位置不判断,直接长度1 
    for(int i=1;i<=len-1;i++){
        if(a[i]==a[i-1]){ //长度:能够续在前面的字符后面 
            b[i]=b[i-1]+1;
        }else{  //字符和前面不一样,重新开始计数 
            b[i]=1;
        }
         
        if(mx<b[i]){  //打擂台 
            mx=b[i];
            mc=a[i];
        }  
    }
    cout<<mc<<' '<<mx<<endl;
    return 0;
}

解法二:每次连续字符统计结束,计算长度,就打擂台。

#include<iostream>
using namespace std;
int mx=0,t=0;
char mc;
string a;
int main(){
    cin>>a;
    for(int i=0;i<=a.size()-1;i++){
        t++;
        if(a[i]!=a[i+1]){//当前字符与下个字符不等,则连续统计结束
            if(t>mx){ //打擂台
                mx=t; //更新连续字符最大值
                mc=a[i]; //记录最大数量的字符
            }
            t=0;  //打完擂台,下个字符应该重新计数 
        }
    }
    cout<<mc<<' '<<mx<<endl; 
    return 0;
}

过滤多余的空格

带空格字符数组的输入,并过滤掉多余的空格。

#include<iostream>
#include<cstring>
using namespace std;
char a[10000];
int main(){
    fgets(a, sizeof(a), stdin); //带空格的字符数组
    int len=strlen(a);
    for(int i=0;i<=len-1;i++){  //0下标到len-1下标
        if(a[i]!=' '){  //不为空格直接输出
            cout<<a[i];
        }else if(a[i]==' '&&a[i+1]!=' '){//空格后面不为空格输出
            cout<<a[i]; //多个连续空格则只输出一个空格
        }
    }
    return 0;
} 

图像叠加 

二维数组的遍历。

#include<iostream>
using namespace std;
int m,n,a[999][999],b[999][999];
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cin>>b[i][j];
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(a[i][j]==1||b[i][j]==1){ //都为1,则输出1
                cout<<'1'<<' ';
            }else{ //否则,输出0
                cout<<'0'<<' ';
            }
        }
        cout<<endl;
    }
    return 0;
} 

最好的草 

遍历二维数组中的每个字符,避免草堆重复计数。

#include<iostream>
#include<cstring>

using namespace std;
int r,c,t=0;
char a[110][110];
int main(){
    cin>>r>>c;
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            cin>>a[i][j];
        }
    }
     
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            if(a[i][j]=='#'){  //找到草堆
                t++;   //计数后,把连续的草变成空地,避免重复计数 
                a[i][j+1]='.'; //右边的和下边的属于同一堆草
                a[i+1][j]='.';
            }
        }
    }
    cout<<t<<endl;
    return 0;
}

小白鼠再排队 

解法一:冒泡排序

#include<iostream>
using namespace std;
int n,a[1010];
string b[1010]; 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
    }
    //冒泡排序 
    for(int i=1;i<=n-1;i++){  //n-1轮 
        for(int j=1;j<=n-1;j++){ //每一轮比较相邻的第j项和第j+1项数据 
            if(a[j+1]<a[j]){  //比较重量,下面将交换重量和帽子颜色 
                int t1=a[j];  //交换重量 
                a[j]=a[j+1];
                a[j+1]=t1;
                string t2=b[j];  //交换帽子颜色 
                b[j]=b[j+1];
                b[j+1]=t2;
            } 
        } 
    } 
    for(int i=1;i<=n;i++){
        cout<<b[i]<<endl;
    } 
    return 0;
 
}

解法二:结构体的冒泡排序

#include<iostream>
using namespace std;
struct node{ //结构体 
    int w;
    string s;
}; 
node a[110];
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].w>>a[i].s;
    }
    for(int i=1;i<=n-1;i++){ //冒泡排序 
        for(int j=1;j<=n-1;j++){
            if(a[j].w>a[j+1].w){
                swap(a[j],a[j+1]); //交换
            }
        }
    }  
    for(int i=1;i<=n;i++){
        cout<<a[i].s<<endl;
    }
    return 0;
}

解法三:结构体sort排序

#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct ms{ //结构体定义
    int w; //重量
    string c;  //颜色
};
ms a[1010]; //结构体数组
bool cmp(ms m1,ms m2){ //自定义排序规则
    return m1.w<m2.w;  //重量小的排前面 
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].w>>a[i].c; 
    }
    sort(a+1,a+n+1,cmp);  //使用自定义排序规则,按重量从小到大 
    for(int i=1;i<=n;i++){
        cout<<a[i].c<<endl; 
    }
    return 0;
 
}

按照个位数排序 

解法一:从小到大排序,然后按照题目要求输出

#include<iostream>
#include<algorithm>
using namespace std;
int n,a[100010];
 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);  //默认从小到大排序 
     
    for(int k=0;k<=9;k++){  //k 0~9  按照个位从小到大输出 
        for(int i=1;i<=n;i++){  //按本身从小到大输出 
            if(a[i]%10==k) cout<<a[i]<<' '; //a[i]个位和k相等,就输出 
        }
    }
    return 0;
}

解法二:结构体排序

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
int n,a[100010];
bool cmp(int x,int y){ //自定义排序规则 
    if(x%10>y%10){ //个位小的排前面 
        return false;
    }else if(x%10==y%10 && x>y){  //个位相同,数字小的排前面 
        return false;
    }
    return true;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1,cmp);  //使用自定义排序规则排序
     
    for(int i=1;i<=n;i++){  
        cout<<a[i]<<' ';       
    }
    return 0;
}

出书最多

综合性题目,主要考察字符数组的熟练度。

#include<bits/stdc++.h>
using namespace std;
int m,a[200][1010]; 
int mx=0;
char mxc;
int main(){
    cin>>m;
    while(m--){ //m组数据
        int id;  //书
        char c[30]; //作者
        cin>>id>>c;
        int len=strlen(c);
        for(int i=0;i<=len-1;i++){
            char x=c[i];
            a[x][0]++; //作者x的书的数量++
            a[x][a[x][0]]=id; //记录书的id
            if(a[x][0]>mx){  //书的数量打擂台
                mx=a[x][0];  //更新最大数量
                mxc=x;       //更新作者
            }
        }
    }
    cout<<mxc<<endl;
    cout<<mx<<endl;
    for(int i=1;i<=mx;i++){ //输出出书最多的作者的每本书
        cout<<a[mxc][i]<<endl;
    }
        return 0;
}