二级对题目的分析能力要求更高了,语法要掌握一维数组、二维数组、字符数组、结构体、函数的使用,算法技巧要熟练掌握数组的遍历、打擂台求最值、数组计数法、冒泡排序、简单的结构体排序。
打字员
考察字符数组的遍历,分析题目得到大小写切换对结果的影响。
#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;
}