算法竞赛入门【码蹄集新手村600题】(MT1451-1500)
前言
为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~
为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。同时,也是我作为百度松果计划成员的主要OJ题周测平台,另有清华,中科院,北京工业等各知名院校和院所的强力支持,是故选择了它
目录
1. MT1451 魔方阵
(1)题目描述
输出N阶奇数阶魔方阵。所谓N阶魔方阵,就是把1 ~n*n个连续的正整数填到一个N行N列的方阵中,使得每一列、每一行以及两个对角线的元素和都相等。
格式
输入格式: 输入为整型N
.
输出格式: 输出N阶魔方阵
样例1
输入格式: 3
.
输出格式:
8 1 6
3 5 7
4 9 2
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int row,col,n,a[100][100] = {0};
scanf("%d",&n);
row=0;
col=(n-1)/2;
a[row][col] = 1;
for(int i=2;i<=n*n;i++){
if(a[(row-1+n)%n][(col+1)%n]==0){
row = (row-1+n)%n;
col = (col+1)%n;
}else{
row = (row+1)%n;
}
a[row][col]=i;
}
for(row=0;row<n;row++){
for(col=0;col<n;col++) cout<<a[row][col]<<" ";
cout<<endl;
}
return 0;
}
2. MT1452 替换转置
(1)题目描述
输入一个M ×N的整数数组,把原来的负数全部替换成对应的正数,正数替换成负数,比如-5替换成5,再转置输出。不考虑非法输入或者溢出等特殊情况。
格式
输入格式: 第一行输入M和N(均小于100),第二行输入数组元素,空格分隔。
.
输出格式:输出矩阵
样例1
输入格式:
3 2
8 9
-5 4
-1 -7
.
输出格式:
-8 5 1
-9 -4 7
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int m,n,a[100][100];
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++) printf("%d ",-a[j][i]);
printf("\n");
}
return 0;
}
3. MT1453 逆时针旋转矩阵
(1)题目描述
输入正整数N,把一个大小为NxN的方阵,逆时针旋转180度后输出。
格式
输入格式: 第一行输入数组长度N,后N行按方阵输入数组元素,整型,空格分隔。
.
输出格式: 按方阵输出,整型,空格分隔。
样例1
输入格式:
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
.
输出格式:
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,a[100][100];
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=n-1;i>=0;i--){
for(int j=n-1;j>=0;j--) cout<<a[i][j]<<" ";
printf("\n");
}
return 0;
}
4. MT1454 字符串输入输出方法I
(1)题目描述
输入一个字符串,输出字符串。请在循环中%c一个字符一个字符的输入输出。
格式
输入格式: 分2行输入。第一行输入字符串长度n,第二行输入字符串
.
输出格式: 输出字符型
样例1
输入格式:
5
abcde
.
输出格式: abcde
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
char ch[10005]="";
scanf("%d\n",&n);
for(int i=0;i<n;i++) scanf("%c",&ch[i]);
for(int i=0;i<n;i++) printf("%c",ch[i]);
return 0;
}
5. MT1455 字符串输入输出方法ll
(1)题目描述
输入一个字符串,输出字符串。请用‰%s输入输出整个字符串。本题不考虑空格。
格式
输入格式: 分2行输入。第一行输入字符串长度n,第二行输入字符串。
.
输出格式: 输出字符型
样例1
输入格式:
5
abcde
.
输出格式: abcde
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
scanf("%d\n",&n);
string s;
getline(cin,s);
cout<<s<<endl;
return 0;
}
6. MT1456 字符串输入输出方法III
(1)题目描述
输入一个字符串,输出字符串。本题请调用fgets和fputs实现字符串输入输出。
格式
输入格式: 分2行输入。第一行输入字符串长度n (n<80),第二行输入字符串
.
输出格式: 输出字符型
样例1
输入格式:
5
abcde
.
输出格式: abcde
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
char s1[1005];
scanf("%d\n",&n);
fgets(s1,n+1,stdin);
fputs(s1,stdout);
return 0;
}
7. MT1457 字符串输入输出方法IV
(1)题目描述
输入一个字符串,输出字符串。请用scanf(“%1%*c”,str);输入
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: 12345
.
输出格式: 12345
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s[100];
scanf("%[^\n]%*c",s);
printf("%s",s);
return 0;
}
8. MT1458 字符串数组
(1)题目描述
定义一个字符串数组char A3,按字符串方式来进行输入和输出(串中不含空格)。
格式
输入格式: 分3行输入,每行输入一个字符串
.
输出格式: 分3行输出,每行输出一个字符串
样例1
输入格式:
aaa
bbbb
cccccc
.
输出格式:
aaa
bbbb
cccccc
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s;
for(int i=0;i<3;i++){
cin>>s;
cout<<s<<endl;
}
return 0;
}
9. MT1459 字符串长度函数
(1)题目描述
定义一个字符数组,长度为80,输入一个字符串,用字符串长度函数计算有效的长度并输出,然后用sizeof计算数组长度并输出,看看有什么不同。
格式
输入格式: 输入字符串
.
输出格式: 输出为整型,空格分隔。
样例1
输入格式: 12345
.
输出格式: 5 80
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80];
cin.getline(a, 80);
printf("%d %d",strlen(a),sizeof(a));
return 0;
}
10. MT1460 字符串长度
(1)题目描述
编写程序,在不使用标准字符串函数的情况下求一个字符串S1的长度。
格式
输入格式: 输入字符串(长度小于80)
.
输出格式:输出为整型
样例1
输入格式: 123456
.
输出格式: 6
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80];
cin.getline(a, 80);
int n=0;
while(a[n] !='\0') n++;
cout<<n;
return 0;
}
11. MT1461 字符串复制函数
(1)题目描述
用字符串复制函数把b字符串复制到a字符串里面,输出结果。
格式
输入格式: 输入字符串b
.
输出格式: 输出字符串a
样例1
输入格式: 12345
.
输出格式: 12345
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s;
cin>>s;
cout<<s;
return 0;
}
12. MT1462 字符串复制
(1)题目描述
编写程序,在不使用标准字符串函数的情况下将一个字符串S1的内容复制给另一个字符串S2。
格式
输入格式: 输入字符串S1(长度小于80)
.
输出格式: 输出字符串S2
样例1
输入格式: 123456
.
输出格式: 123456
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s1[1005],s2[1005];
cin.getline(s1, 10005);
int len = strlen(s1);
for(int i=0;i<len;i++){
s2[i] = s1[i];
}
cout<<s2<<endl;
return 0;
}
13. MT1463 字符串连接函数
(1)题目描述
用字符串连接函数把两个字符串拼接在一起,输出结果。
格式
输入格式: 2个字符串分2行输入。
.
输出格式: 输出字符串
样例1
输入格式:
12345
abcde
.
输出格式: 12345abcde
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s1[1005],s2[1005];
scanf("%s",s1);
scanf("%s",s2);
strcat(s1, s2);
cout<<s1<<endl;
return 0;
}
14. MT1464 字符串连接
(1)题目描述
编写程序,在不使用标准字符串函数的情况下将两个字符串S1和S2连接起来,结果保存在S1字符串中。
格式
输入格式: 分两行输入字符串S1和S2(长度小于80)
.
输出格式: 输出字符串S1
样例1
输入格式:
123456
abc
.
输出格式: 123456abc
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80],b[80];
cin.getline(a, 80);
cin.getline(b, 80);
int lena = strlen(a);
int lenb = strlen(b);
for(int i=lena,j=0;i<lena+lenb;i++,j++){
a[i] = b[j];
}
a[lena+lenb]='\0';
printf("%s",a);
return 0;
}
15. MT1465 字符串比较函数
(1)题目描述
输入2个字符串,用字符串比较函数比较他们并输出结果。
格式
输入格式: 字符串分2行输入
.
输出格式: 输出整型
样例1
输入格式:
12345
2
.
输出格式: -1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s1[80],s2[80];
scanf("%s",s1);
scanf("%s",s2);
printf("%d",strcmp(s1,s2));
return 0;
}
16. MT1466 字符串比较
(1)题目描述
编写程序,在不使用标准字符串函数的情况下比较两个字符串S1和S2,如果S1>S2,输出1;如果S1=S2,输出0;如果S1<S2,输出-1。
格式
输入格式: 分两行输入字符串S1和S2(长度小于80)
.
输出格式: 输出为整型
样例1
输入格式:
123456
abc
.
输出格式: -1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s1,s2;
getline(cin, s1);
getline(cin, s2);
if(s1>s2) cout<<1;
else if(s1==s2) cout<<0;
else cout << -1;
cout << endl;
return 0;
}
17. MT1467 字符串比较
(1)题目描述
利用指针完成字符串比较函数int mystrcmp(char s1,char s2),比较字符串s1, s2(字符串长度小于10000),如果s1>s2输出1,小于则输出-1,相等输出0。
格式
输入格式: 分两行输入字符串s1,s2
.
输出格式: 输出整数
样例1
输入格式:
I love C!
C is great!
.
输出格式: 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int mystrcmp(char *s1,char *s2){
while(*s1 !='\0' && *s2 != '\0'){
if(*s1 > *s2) return 1;
else if(*s1 < *s2) return -1;
s1++;
s2++;
}
if(*s1 != '\0') return 1;
else if(*s2 != '\0') return -1;
return 0;
}
int main( )
{
char str1[10000] = "",str2[10000]="";
scanf("%[^\n]%*c",str1);
scanf("%[^\n]%*c",str2);
cout<<mystrcmp(str1, str2);
return 0;
}
18. MT1468 字符串前缀
(1)题目描述
两个字符串可能有相同的前缀,输出这个前缀。
格式
输入格式: 分两行输入字符串S1和S2
.
输出格式: 输出字符串前缀
样例1
输入格式:
aa123456
aabc
.
输出格式: aa
备注:
字符串中可能含有空格
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void samePre(char s1[],char s2[],char s3[]){
int pos=0;
while(s1[pos] == s2[pos]){
s3[pos]=s1[pos];
pos++;
}
s3[pos]='\0';
return ;
}
int main( )
{
char s1[100],s2[100],s3[100];
cin.getline(s1, 100);
cin.getline(s2, 100);
samePre(s1, s2, s3);
printf("%s\n",s3);
return 0;
}
19. MT1469 间隔输出串
(1)题目描述
将字符串l love c++赋给一个字符数组,然后从第一个字母开始间隔地输出该串。
格式
输入格式: 无
.
输出格式: 输出字符串
样例1
输入格式: 无
.
输出格式: Ilv +
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<"Ilv +";
return 0;
}
20. MT1470 字符串切割
(1)题目描述
输入字符串s1(长度小于80,由大小写字母构成,不含空格),和正整数N(小于字符串长度),把字符串切割成每N个字符一份,并输出(最后一份可以小于N)。
格式
输入格式: 分两行输入字符串s1和正整数N
.
输出格式: 输出切割后的字符串,每一份一行
样例1
输入格式:
adfasdfsadsgsg
3
.
输出格式:
adf
asd
fsa
dsg
sg
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s1[80];
int n,len;
scanf("%s",s1);
scanf("%d",&n);
len = strlen(s1);
for(int i=0;i<len;i++){
printf("%c",s1[i]);
if((i+1)%n == 0) printf("\n");
}
return 0;
}
21. MT1471 反转
(1)题目描述
输入一个字符串,输出字符串反转后的内容
格式
输入格式: 输入字符型
.
输出格式: 输出字符型
样例1
输入格式: i hate u
.
输出格式: u etah i
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void reverse(char *start,char *end){
while(start < end){
int tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
int main( )
{
char arr[80];
cin.getline(arr,100);
reverse(arr, arr+strlen(arr)-1);
printf("%s",arr);
return 0;
}
22. MT1472 字符串反向
(1)题目描述
输入字符串s1(不含空格),将字符串反向存放并输出。
格式
输入格式: 输入字符串(长度小于80)
.
输出格式: 输出字符,空格分隔
样例1
输入格式: water
.
输出格式: retaw
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s1;
string s2="";
getline(cin,s1);
for(int i=s1.length()-1;i>=0;i--){
s2 += s1[i];
}
cout<<s2;
return 0;
}
23. MT1473 左移n位
(1)题目描述
输入一个字符串(长度不超过80),输出字符串左移n位后的内容。移出去的内容去掉。
格式
输入格式: 分2行输入。第一行输入字符串,第二行输入非负整数n,n小于字符串长度
.
输出格式: 输出字符串
样例1
输入格式:
12345
3
.
输出格式: 45
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80],b[80];
int n;
cin.getline(a, 80);
scanf("%d",&n);
strcpy(b,a+n);
printf("%s",b);
return 0;
}
24. MT1474 右移n位
(1)题目描述
输入一个字符串(长度不超过80),输出字符串右移n位后的内容。移出去的内容去掉。
格式
输入格式: 分2行输入。第一行输入字符串,第二行输入输入非负整数n, n小于字符串长度
.
输出格式: 输出字符串
样例1
输入格式:
12345
3
.
输出格式: 12
备注:
字符串可能包含空格
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80];
int n;
cin.getline(a,80);
scanf("%d",&n);
a[strlen(a)-n] = '\0';
printf("%s",a);
return 0;
}
25. MT1475 回旋字符串
(1)题目描述
输入字符串s1,s2(均不含空格),判断s1是否为s2的回旋字符串,输出YES或者NO。
格式
输入格式: 分两行输入字符串s1,s2(长度都小于80)
.
输出格式: 输出整数
样例1
输入格式:
waterbottle
erbottlewat
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
string s1,s2,s11,s22;
cin >>s1>>s2;
s11=s1+s1;
s22=s2+s2;
if (s11. find (s2)!= string :: npos &&s22.find(s1)!= string :: npos )
cout <<"YES ";
else
cout <<"NO ";
return 0;
}
26. MT1476 右旋n位
(1)题目描述
输入一个字符串,输出字符串右旋n位后的内容
格式
输入格式: 分2行输入。第一行输入字符串,第二行输入整数n
.
输出格式: 输出字符串
样例1
输入格式:
12345
3
.
输出格式: 34512
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
//sour[]数组下标为 beginS 开始,一共复制 n 个字符给 dest[],后者起始下标为 beginD
void arrayCopy ( char sour[], int beginS , int n , char dest [], int beginD ){
for( int i=1; i <= n ;i++) dest[beginD++]= sour[beginS++];
}
int main(){
char a [100], b [100];
int n , m ;
cin.getline (a ,100);
cin >> m ;
n = strlen (a);
for ( int i =0; i < n ; i ++) cin >> a [ i ];
m = m % n ;
arrayCopy(a , n-m , m , b ,0);
arrayCopy(a ,0, n-m , b , m );
for( int i =0; i < n ; i ++){
cout << b [i];
}
return 0;
}
27. MT1477 左旋n位
(1)题目描述
输入一个字符串,输出字符串左旋n位后的内容
格式
输入格式: 分2行输入。第一行输入字符串,第二行输入整数n
.
输出格式: 输出字符串
样例1
输入格式:
12345
3
.
输出格式: 45123
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
//sour[数组下标为 beginS 开始,一共复制 n 个字符给 dest [],后者起始下标为 beginD
void arrayCopy ( char sour[], int beginS , int n , char dest [], int beginD ){
for ( int i =1; i<=n ; i ++)
dest [ beginD ++]= sour[ beginS ++];
}
int main ()
{
char a [100], b [100];
int n , m ;
cin . getline ( a ,100);
cin >> m ;
n = strlen ( a );
m = m % n ;
arrayCopy ( a , m , n - m , b ,0);
arrayCopy ( a ,0, m , b , n - m );
for ( int i=0; i<n ; i ++)
cout << b [i];
return 0;
}
28. MT1478 插入A
(1)题目描述
从键盘上输入一个字符串(长度小于10000,以回车作为结束,其余地方不出现回车),按后按照下面要求输出一个新字符串,新的字符串是在原来字符串中,每两个字符之间插入一个A,输出新产生的字符串。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: abcd
.
输出格式: aAbAcAd
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char s1[10000],s2[20000];
cin . getline (s1,10000);
int len = strlen (s1);
for ( int i =0; i < len -1; i ++){
s2[ i *2]=s1[ i ];
s2[ i *2+1]='A';
}
s2[ len *2-2]=s1[ len -1];
s2[ len *2-1]='\0';
cout <<s2;
return 0;
}
29. MT1479 字符串插入
(1)题目描述
将一个字符串插入到另一个字符串指定位置处。
格式
输入格式: 分行输入字符串,最后一行输入指定位置。
.
输出格式: 输出字符串
样例1
输入格式:
aaaaa
bbb
2
.
输出格式: aabbbaaa
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
void insert ( char *s1, char *s2, int pos ){
int len1= strlen (s1);
int len2= strlen (s2);
for ( int i=len1; i>pos-1; i--) s1[i+len2]=s1[i];
for ( int i =0; i <len2; i++) s1[i+ pos]=s2[i];
}
int main (){
char s1[100],s2[100];
int pos=0;
cin.getline (s1,100);
cin.getline (s2,100);
cin>>pos;
insert (s1,s2,pos);
cout<<s1<<endl;
return 0;
}
30. MT1480 替换空格
(1)题目描述
输入字符串s1,找出字符串的所有空格,把它替换成**输出。
格式
输入格式: 输入字符串(长度小于80)
.
输出格式: 输出字符串
样例1
输入格式: Wendy love C++! C++ is great!
.
输出格式: Wendy loveC++! C++was**great!
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char a[80], b [100];
cin . getline ( a ,80);
int len = strlen ( a ), pos =0;
for ( int i =0; i < len ; i ++){
if (a[i]==' '){
b[ pos ++]='*' ;
b[ pos ++]='*' ;
}else
b[ pos ++]= a [ i ];
}
b [ pos ]='\0';
cout << b ;
return 0;
}
31. MT1481 小码哥的乐谱
(1)题目描述
小码哥是个小马虎老是写错乐谱,你不得不帮他替换一下。法则是下面这些等式中,左右两边的字符互换A#=Bb,C#=Db,D#=Eb,F#=Gb,G#=Ab。
格式
输入格式: 输入字符串,其总长度小于80。输入如样例所示,乐谱符号后面空一格输入minor或者major。
.
输出格式: 输出字符串
样例1
输入格式: Ab minor
.
输出格式: G# minor
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char a[80];
cin.getline(a,80);
int len = strlen(a);
for ( int i=0; i<len; i++){
if (a[i]=='A' && a[i+1]=='#') a[i]='B', a[i+1]='b';
else if ( a[i]=='C'&& a[i+1]=='#') a [i]='D', a [i+1]='b';
else if ( a[i]=='D'&& a[i+1]=='#') a [i]='E', a [i+1]='b';
else if ( a[i]=='F'&& a[i+1]=='#') a [i]='G', a [i+1]='b';
else if ( a [i]=='G'&& a [ i +1]=='#') a [ i ]='A', a [ i +1]='b';
else if ( a [ i ]=='B'&& a [ i +1]=='b') a [ i ]='A', a [1+1]='#';
else if ( a [ i ]=='D'&& a [ i +1]=='b') a [ i ]='C', a [ i +1]='#';
else if ( a [ i ]=='E'&& a [ i +1]=='b') a [ i ]='D', a [ i +1]='#';
else if ( a [ i ]=='G'&& a[i+1]=='b') a [ i ]='F', a [1+1]='#';
else if(a[i]=='A'&&a[i+1]=='b') a[i]='G',a[i+1]='#';
}
printf ("%s\n",a);
return 0;
}
32. MT1482 删除空格
(1)题目描述
编写程序,去掉一个字符串全部空格。
格式
输入格式: 输入字符串,长度为n (n<100000)
.
输出格式: 输出字符串
样例1
输入格式: 1 2 3 4 5 6
.
输出格式: 123456
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char s [1000];
char newS [1000];
cin.getline ( s ,1000);
int j =0;
for ( int i =0; i < strlen ( s ); i ++)
if ( s [ i ]!=' ')
newS [ j ++]= s [ i ];
newS [ j ]='\0';
cout << newS << endl ;
return 0;
}
33. MT1483 首尾空格
(1)题目描述
编写程序,去掉一个字符串(长度小于80)首尾空格。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: 123456
.
输出格式:123456
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char s [80];
cin . getline ( s ,80);
int start =0, end = strlen ( s )-1;
for ( int i =0; i < strlen ( s ); i ++)
if ( s [i]==' ') start ++;
else break ;
for ( int i = strlen ( s )-1; i >=0; i--)
if ( s [ i ]==' ') end --;
else break ;
for ( int i = start ; i <= end ; i ++)
printf ("%c", s [ i ]);
return 0;
}
34. MT1484 删除空格标点
(1)题目描述
输入字符串s1,找出字符串的所有空格和标点符号删除后输出。(假定标点符号只包含英文感叹号,逗号和句号)
格式
输入格式: 输入字符串(长度小于80)
.
输出格式: 输出字符串
样例1
输入格式: Wendy love C++! C++ is great!
.
输出格式: WendyloveC++C++isgreat
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char s [80];
char newS [80];
cin.getline ( s ,80); int j =0;
for ( int i =0; i < strlen ( s );i++)
if (s[i]!=' '&&s[ i ]!='!'&& s[i]!='.'&& s[i]!=',')
newS[j++]=s[i];
newS[j]='\0';
cout << newS << endl ;
return 0;
}
35. MT1485 删除字符
(1)题目描述
输入2个字符串A和B,删除第一个字符串中包含的第二个字符串中的字符。如果不包含则原样输出第一个字符串。
格式
输入格式: 输入2个字符串,长度为n (n<100)
.
输出格式: 转换后的字符串
样例1
输入格式:
123456
123
.
输出格式: 456
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
bool findChar ( char c , char a []){
for ( int j =0; j < strlen ( a ); j ++)
if ( c ==a [j])
return true ;
return false ;
}
int main (){
char s1[100],s2[100], newS [100];
cin . getline (s1,100);
cin . getline (s2,100);
int k =0;
for ( int i =0; i < strlen (s1); i ++)
if (! findChar (s1[ i ],s2))
newS [ k ++]=s1[ i ];
newS [ k ]='\0';
cout << newS ;
return 0;
}
36. MT1186 字符搜索
(1)题目描述
编写程序,在不使用标准字符串函数的情况下搜索一个字符在字符串中的位置。如果没有搜索到位置为-1。从0开始计数。
格式
输入格式: 分两行输入,第一行输入要搜索的字符,第二行输入字符串(长度小于80)
.
输出格式: 输出为整型
样例1
输入格式:
3
123456
.
输出格式: 2
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char c , a [80];
scanf ("%c",&c);
getchar ();
cin.getline ( a ,80);
for ( int i =0; i < strlen ( a );i ++)
if ( a [ i ]== c){
cout << i ;
return 0;
}
cout <<-1;
return 0;
}
37. MT1487 检查子串
(1)题目描述
输入字符串(长度小于80,不含空格)S,如果在字符串S中找到字母则输出YES,没有输出NO。
格式
输入格式: 输入字符串(不含空格)
.
输出格式: 输出YES或者NO
样例1
输入格式: C++!
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char s [80]; scanf ("%s ", s );
int len = strlen ( s );
for ( int i =0; i < len ; i ++)
if (( s [ i ]>='A'&& s [ i ]<='Z')||( s [ i ]>='a'&& s [ i ]<='z')) {
printf ("YES\n");
return 0;
}
printf ("NO\n");
return 0;
}
38. MT1488 最大和最小字符
(1)题目描述
输入字符串s1(不含空格),查找字符串中最大和最小(ASCII值,区分大小写)字符并输出。
格式
输入格式: 输入字符串(长度小于80)
.
输出格式: 输出最大和最小字符,空格分隔
样例1
输入格式: waterbottle
.
输出格式: w a
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char s1[80];
scanf ("%s",s1);
int len = strlen (s1);
char max =s1[0], min =s1[0];
for ( int i =0; i < len ; i ++)
if (s1[ i ]> max ) max =s1[ i ];
else if (s1[i]< min ) min =s1[ i ];
printf ("%c %c", max , min );
return 0;
}
39. MT1489 字符串的大小写转换
(1)题目描述
给定一个字符串,将所有的大写字母转换成小写,并把所有小写的转换为大写。
格式
输入格式: 一个长度为100000以内的字符串
.
输出格式: 转换后的字符串
样例1
输入格式: AbCdEf
.
输出格式: aBcDeF
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char s [100000];
cin.getline ( s ,100000);
for ( int i =0; i < strlen ( s ); i ++){
if ( s [ i ]>='a'&& s [ i ]<='z')
s[i]-=32;
else if ( s [ i ]>='A'&& s [ i ]<='Z')
s[i]+=32;
}
cout << s << endl ;
return 0;
}
40. MT1490 修改字符串
(1)题目描述
输入1个字符串,如果其中小写字符多于大写字符,则将其全部转换为小写字符,如果大写字符多于小写字符,则全部转换为大写字符。
格式
输入格式: 输入1个字符串,长度为n (n<100000)
.
输出格式: 转换后的字符串
样例1
输入格式: abcdefGHi
.
输出格式: abcdefghi
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main (){
char s [100000];
cin.getline ( s ,100000);
int num_a =0, num_A =0;
for ( int i =0; i < strlen ( s ); i ++){
if ( s[i]>='a'&& s [i]<='z')
num_a ++;
else if ( s[i]>='A'&& s[i]<='Z')
num_A ++;
}
for( int i =0; i < strlen(s);++ i ){
if (num_a < num_A && s[i]>='a'&& s[i]<='z')
s[i]-=32;
if ( num_a > num_A & s[i]>='A'& s[i]<='Z')
s[i]+=32;
}
cout << s << endl ;
return 0;
}
41. MT1491 标点符号
(1)题目描述
假定一个字符串(长度小于80)存在的标点符号有感叹号、逗号、句号、问号这几种英文符号,分别计算这些符号有多少个并输出结果。
格式
输入格式: 输入字符串
.
输出格式: 输出整型,空格分隔
样例1
输入格式: Good Morning! Miss Wendy Potter, have you seen your mom? She love u.
.
输出格式: 1 1 1 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char a [80];
cin.getline ( a ,80);
int len = strlen ( a );
int na =0, nb =0, nc =0, nd =0;
for ( int i =0; i < len ; i ++){
if (a[i] == '!') na++;
if (a[i] == ',') nb++;
if (a[i] == '.') nc++;
if (a[i] == '?') nd++;
}
printf ("%d %d %d %d ", na , nb , nc , nd );
return 0;
}
42. MT1492 元音计数
(1)题目描述
输入1个字符串(不含空格),统计其中出现的元音字母的个数。
格式
输入格式: 一个字符串,长度n (n<100000)
.
输出格式: 其中元音字母的个数
样例1
输入格式: aeiou
.
输出格式: 5
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char s [100000];
char check[11]="aeiouAEIOU";
scanf ("%s",s);
int len = strlen (s);
int cnt =0;
for ( int i =0; i < len ;i++)
for ( int j=0; j<10; j ++)
if ( check [j]== s [i])
cnt++;
printf ("%d", cnt );
return 0;
}
43. MT1493 出现最多的首字母
(1)题目描述
输入1个字符串,是空格分隔的一个个单词。统计其中出现次数最多的首字母。
格式
输入格式: 输入1个字符串,长度为n (n<100000)
.
输出格式: 出现次数最多的首字母(如果有多个,输出ASCII码最小的字母)注意输出小写字母!
样例1
输入格式: aword bword cword aword
.
输出格式: a
(2)参考代码
#include <iostream>
using namespace std ;
int main ()
{
char s[10000][10];
int num =0;
while(~scanf("%s",&s[num])) num++;
int cnt [26]={0};
for ( int i=0; i<num;i++){
if(s[i][0]<='Z'&& s[i][0]>='A')
s[i][0]+=32;
cnt[s[i][0]-'a']++;
}
int tmp =-1, id =-1;
for ( int i=0; i <26; i ++){
if ( tmp < cnt [i]){
tmp = cnt [ i ];
id = i ;
}
}
printf ("%c",'a'+ id );
return 0;
}
44. MT1494 出现最多的单词
(1)题目描述
输入1个字符串(不含数字或者其他字符,只含大小写字母和空格,单词不区分大小写),该字符串是空格分隔的一个个单词,这些单词长度相等都包含5个字符。统计其中出现次数最多的单词。
格式
输入格式: 输入1个字符串,长度为n (n<100)
.
输出格式: 出现次数最多的单词(若有多个单词满足条件,输出原输入顺序最靠前的满足条件的单词,单词输出小写即可)
样例1
输入格式: worda wordb wordc worda
.
输出格式: worda
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char s[20][6]={0};
int number[20]={0};
int cnt =0;
while (scanf("%s", s[cnt])!= EOF){
for ( int i =0; i <5; i ++){
if (s[cnt][i]<'a')
s[cnt][i]+=32;
}
cnt ++;
}
int res =0;
for ( int i =0; i < cnt ; i ++){
for ( int j = i ; j < cnt ; j ++)
if ( strcmp(s[i], s[j])==0)
number[i]++;
res = max(res,number[i]);
}
for ( int i =0; i < cnt ; i ++)
if ( res == number [ i ]){
printf("%s", s[i]);
break;
}
return 0;
}
45. MT1495 单词
(1)题目描述
编写程序,输入一个字符串,统计其中有多少个单词(单词用空格、逗号、小数点分隔)。
格式
输入格式: 输入字符串
.
输出格式: 输出为整型
样例1
输入格式: i love u
.
输出格式: 3
备注:
本题中,所有符号均为英文符号。非空格、非逗号、非小数点的符号,均视为单词的正确组成部分。
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
bool judge ( char a ){
if ( a ==' '|| a =='.'|| a ==',') return true ;
else return false ;
}
int main ()
{
char a[80];
cin.getline(a ,80);
int len = strlen (a), cnt =0;
if (! judge (a[0])) cnt ++;
for ( int i =1; i < len ; i ++)
if ( judge ( a[i -1])&! judge ( a[i]))
cnt ++;
cout << cnt ;
return 0;
}
46. MT1496 重复字符
(1)题目描述
输入字符串s1(只包含字母和空格),查找字符串中的重复字符(指26个英语字母,区分大小写),从小到大(ASCII值)排序他们并输出。
格式
输入格式: 输入字符串(长度小于80)
.
输出格式: 输出字符,空格分隔
样例1
输入格式: Wendy is a great girl
.
输出格式: a e g i r
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char a[80], b[26]={0}, c[26];
cin.getline(a,80);
int len = strlen(a);
for(int i=0; i<len; i++){
if(a[i]>='A' && a[i]<='z')
b[a[i]-'A']++;
else if (a[i]>='a' && a[i]<='z')
c[a[i]-'a']++;
}
for(int i=0; i<26; i++)
if(b[i]>1) printf("%c ",'A'+i);
for(int i=0; i<26; i++)
if(c[i]>1) printf("%c ",'a'+i);
return 0;
}
47. MT1497 字符串中唯一字符
(1)题目描述
给定一个字符串(均为小写字母组成,不含空格),找到它的第一个不重复的字符,并返回它的索引(从O开始)。如果不存在,则返回 -1。
格式
输入格式: 输入字符串s
.
输出格式: 输出索引,不存在输出-1
样例1
输入格式: lovenwpulovenpu
.
输出格式: 153
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
char a [80], b [26]={0};
cin.getline ( a ,80);
int len = strlen(a);
for( int i =0; i<len ; i ++)
if( a[i]>='a'&& a[i]<='z')
b[a[i]-'a']++;
for ( int i =0; i < len ; i ++)
if ( b [ a [ i ]-'a']==1){
printf ("%d", i );
return 0;
}
printf ("%d",-1);
return 0;
}
48. MT1498 整数转换字符串
(1)题目描述
将一个整型数据(有正负号)转换成字符串。
格式
输入格式: 输入为整型
.
输出格式: 输出字符串
样例1
输入格式: -123
.
输出格式: -123
样例2
输入格式: +34
.
输出格式: +34
备注:
数值较大,需要定义为long类型。不考虑输入为0的特殊情况。
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
long n , i =0;
char a[10];
scanf ("%ld", &n );
if(n>0) printf ("%c",'+');
else if ( n <0)
n = -n , printf ("%c",'-');
while ( n ){
a[i++]= n%10+'0';
n/=10;
}
for (int j = i -1; j >=0; j --)
printf ("%c", a[j]);
return 0;
}
49. MT1499 无符号整数转换
(1)题目描述
将一个无符号整型数据转换成字符串形式的二进制。
格式
输入格式:输入为整型
.
输出格式: 输出为字符串
样例1
输入格式: 35
.
输出格式: 100011
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
int a [32];
unsigned int num ;
scanf("%u",& num );
int cnt =0;
while (num){
a[cnt++]= num & 1;
num /=2;
}
for ( int i=cnt-1; i>=0;i--)
printf ("%d", a[i]);
if (cnt ==0) printf ("0");
return 0;
}
50. MT1500 有符号数转换
(1)题目描述
将一个有符号整型数据转换成字符串形式的八位二进制
(负数使用其补码)
例如,若为-2则输出11111110
格式
输入格式:输入为整型
.
输出格式: 输出为字符串
样例1
输入格式: 35
.
输出格式: 00100011
(2)参考代码
#include<bits/stdc++.h>
using namespace std ;
int main ()
{
int a [8];
int num ;
scanf ("%d",&num);
for ( int i =0; i <8; i ++){
a[i]= num &1;
num >>=1;
}
for ( int i =7; i >=0; i --)
printf ("%d", a [ i ]);
return 0;
}
小结
典型范例:
- 矩形例题:MT1451-1453
- 字符长度:MT1459、MT1460
结语
近期会逐步将码题集题库中的新手村600题刷完,预计每天会更新50题,之后会逐步跟进黄金,钻石,星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?
另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~
愿你的结局,配得上你一路的颠沛流离。
- \n ↩