A-[NOIP2018]标题统计
题意
输入一行数,统计其中共有多少个字符,用一个整数表示字符数(不包括空格和换行符)
思路
总长度减去空格和换行的字符数
坑点
空格容易忘记减去
实现步骤
1.先用for循环统计该标题的总长度;
2.如果有空格和换行,,则需要除去其占用的字符;
3.最后用自增的方式求出字符的数量。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
string s;//生成一个字符串s
int sum=0;
getline(cin,s);//读取字符串
for(int i=0;i<s.length();i++)//用循环表示s的长度
{
if(s[i]!=' '&&s[i]!='\n')//排除空格和换行
{
sum++;//累加
}
}
cout<<sum;
return 0;
}
总结
注意题中括号中的内容。
B - 数字统计
题意
统计给定范围[L, R]中,数字2出现的次数
思路
分个位,十位,百位...,当等于2时累加
坑点
1.要给i赋值,防止被修改
算法
1.定义三个变量L,R,sum
2.给sum赋值0
3.%10抹除个位
4.当i等于2时,sum累加
5.输出sum
实现步骤
1.先用for循环,再用while循环
2.用%10分离每一位,看看是否是2
3.等于2时累加
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int main( )
{
int L,R,sum=0;
cin>>L>>R;
int c=L;
int a[10005];
for(int i=L;i<=R;i++)
{
a[i]=i;
int c=i;//防止i被修改
while(c!=0)
{
if(c%10==2)//c取余等于2时,累加
{
sum++;
}
c/=10;//相当于c=c/10,抹除个位
}
}
cout<<sum;//输出2的个数
return 0;
}
总结
关于for循环while循环的使用,用到取余和复合赋值运算符.
C - 字符串分类
题意
统计n个字符串中有几种本质上不同的字符串
思路
用for循环输入,判断两个字符串是否一样
坑点
ab!=ba
实现步骤
1.输出n个字符串;
2.用两层for循环进行字符串之间的比较,判断其是否一样;
3.字符串一样用break阻止;
4.如果字符串不一样,则进行累加。
代码
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int n,k=1;
cin>>n;
string s[n];
for(int i=0;i<n;i++)
{
cin>>s[i];//输入一组字符串s[i]
}
for(int i=0;i<n-1;i++)
{
int f=1;
for(int j=i+1;j<n;j++)
{
if(s[i]==s[j])
{
f=0;
break;//字符串相同,则停止输出
}
}
if(f==1)
{
k++;//字符串不同进行累加
}
}
cout<<k;
return 0;
}
总结
先用双重循环打印出字符串,再对字符串中的 字符进行比较判断。
D - 李在赣神魔
题意
输入一个n×n的字符矩阵,将其顺时针旋转90度后输出。
思路
1.用二维数组输入一个n×n的字符矩阵
2.按顺时针旋转九十度之后呈现一个倒序
坑点
1.顺时针旋转九十度
算法
1.定义一个变量n,
2.定义一个字符型的二维数组
3.改变for循环内容输出答案
实现步骤
1.先输入一个二维数组
2.用for循环
代码
#include<iostream>
using namespace std;
int main( )
{
int n,i,j;
cin>>n;
char a[1005][1005];
for(i=1;i<=n;i++)//用二维数组输入一个n×n的字符矩阵
{
for(j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=n;i++)
{
for(j=n;j>=1;j--)//顺时针旋转之后呈现一个倒序
{
cout<<a[j][i];//旋转之前的i和旋转之后的j相等
}
cout<<endl;
}
return 0;
}
总结
考察二维数组的运用 注意打草稿
E - 火车上的2连座
题意
A,B两人选择两个二连坐坐下
思路
1.A,B两人一起坐火车,从第一排开始,依次向后判断,如果有两个连座就坐下;
2.如果过道两边都可以座,优先选择左边;
3.有输出YES,没有输出NO。
坑点
必须是过道一侧的两个连座
实现步骤
1.用while输出n排座;
2.用两层for循环对每个座位是否空着进行判断;
代码
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
string a[10000];//输出一组数
int flag=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
if(a[i][0]=='O'&&a[i][1]=='O')
{
a[i][0]='+';
a[i][1]='+';
flag=1;
break;
}
else if(a[i][3]=='O'&&a[i][4]=='O')
{
a[i][3]='+';
a[i][4]='+';
flag=1;
break;//从第一个座位开始判断两个连续的座位是否可以座,如果有座就停止循环
}
}
if(flag=1)
{
cout<<"YES"<<endl;
for(int i=0;i<n;i++)
{
cout<<a[i]<<endl;
}//如果有座,输出“YES”
}
else
{
cout<<"NO"<<endl;
}//否则输出“NO”
}
return 0;
}
总结
将每两个座位作为一组进行判断进行一一判断
F - 字符串操作
题意
给定长度为n的字符串s,进行m次操作,每次将[l,r]范围内所有c1字符改成c2
思路
1.双重for循环
2.在l到r的范围内将c1更改为c2
坑点
1.r一定小于n
算法
1.定义两个变量n,m
2.定义一个字符串a
3.用for循环找到需要更改的位置
4.输出更改完成后的答案
实现步骤
1.用双重for循环
2.在l到r的范围内将c1更改为c2
代码
#include<iostream>
using namespace std;
int main( )
{
int n,m;
string a;
cin>>n>>m;//输入长度n,操作次数m
cin>>a;
for(int i=0;i<m;i++)
{
int l,r;//区间
cin>>l>>r;
char c1,c2; //将c1更改为c2
cin>>c1>>c2;
for(int j=l-1;j<r;j++)
{
if(a[j]==c1)
{
a[j]=c2;//找到后更改
}
}
}
cout<<a;//输出更改后的
return 0;
}
总结
考察字符替换方法,用到二重循环