0%

c练习四(有关字符串的操作)

1. 项目一

问题

  • 描述
    判断一个由a-z这26个字符组成的字符串中哪个字符出现的次数最多
  • 输入
    第1行是测试数据的组数n,每组测试数据占1行,是一个由a-z这26个字符组成的字符串
    每组测试数据之间有一个空行,每行数据不超过1000个字符且非空
  • 输出
    n行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中间是一个空格。
    如果有多个字符出现的次数相同且最多,那么输出ascii码最小的那一个字符
  • 样例输入
    2
    abbccc
    adfadffasdf
  • 样例输出
    c 3
    f 4

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#include<string.h>
#define MAX 1000
void max_count()
{
int n;
scanf("%d",&n);
char str[MAX];
int st[MAX];

for(int i=0;i<n;i++)
{
scanf("%s",str);
//将a-z的ascll值转换为整数
for(size_t j=0;j<strlen(str);j++)
st[j]=str[j]-'a';
//利用整数数组找出相同的数据
int index=0,max=0;//索引
char flag;
for(size_t i=0;i<strlen(str);i++)
{
index=1;
for(size_t j=i+1;j<strlen(str);j++)
{
if(st[i]==st[j])
index++;
}
if(index>max)
{
max=index;
flag=st[i]+'a';
}
}
printf("%c %d",flag,max);
}
}

int main()
{
max_count();
return 0;
}

2. 项目二

题目
给定两个由大小写字母和空格组成的字符串s1和s2,它们的长度都不超过100个字符、也可以长度为0.判断压缩掉空格、并忽略大小写后,这两个字符串是否相等。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
#include<string.h>
#define MAX 100
void conversion(char str[MAX])
{
for(size_t i=0;i<strlen(str);i++)
{
if(str[i]==' ')
{
//char t;//索引
for(size_t j=i;j<strlen(str)-1;j++)
str[j]=str[j+1];
str[strlen(str)-1]='\0'; //去掉最后一个字符
}
else
if(str[i]>='A'&&str[i]<='Z')
str[i]=str[i]+32;
}
}

void equality()
{
char str1[MAX],str2[MAX];
//scanf("%s%s",str1,str2); 空格或行符结束
gets(str1);//持续读入直到找到换行符才停止
gets(str2);
conversion(str1);
conversion(str2);
if(strcmp(str1,str2)==0)
printf("correct\n");
else printf("error\n");

}
int main()
{
equality();
return 0;
}

3. 项目三

题目

  1. 给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。s和t都由ASCII码的数字和字母组成,且长度不超过100000。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
#include<string.h>
#define MAX 100000
bool contain(char str1[MAX],char str2[MAX])//判断str1是否是str2的子序列 (对str2修改?)
{
int flag=0;
//判断str2中是否存在str1
for(size_t i=0;i<strlen(str1);i++)
{
index:
for(size_t j=0;j<strlen(str2);j++)
{
if(str1[i]==str2[j]) //如果在str2[]中找到和str1[]相同的一个字符,同时将在str[2]找到的字符删除 以免出现错误
//例如str1含两个a,而str2含一个a,如果不删除str2中的a将会出现相等的情况
{
flag++;
for(size_t k=j;k<strlen(str2)-1;k++)
str2[k]=str2[k+1];
str2[strlen(str2)-1]='\0';
i++;
goto index;
}
}

}
//printf("%d %d\n",flag,strlen(str1));
if(flag==strlen(str1))
return true;
return false;
}
int main()
{
char s[MAX],t[MAX];
scanf("%s%s",s,t);
if(contain(s,t))
printf("yes\n");
else
printf("not\n");
return 0;
}

4. 项目四

问题
请编写一个函数,其功能是将输入的字符串反转过来。
示例:
输入:s = “hello”
返回:”olleh”

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 10000

void conversion(char str[MAX])
{
//char str1[MAX];
int j=0;
char index=' ';
j=strlen(str)-1;
for(size_t i=0;i<strlen(str)/2;i++)
{
index=str[i];
str[i]=str[j];
str[j]=index;
j--;
}
printf("%s",str);
}

int main()
{
char str[MAX];
printf("s=");
scanf("%s",str);
conversion(str);
return 0;
}

5. 项目五

问题
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例
输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 1000
int reverse(int x)
{
long a;
char str[MAX];
int i=0;
while(x!=0) //整数转化为字符串
{
a=x%10;
str[i]=a+'0';
i++;
x=x/10;
}
printf("%s",str);
if(x<(-1)*pow(2,32)||x>pow(2,32)-1)
return 0;
}
int main()
{
int x;
scanf("%d",&x);
reverse(x);
return 0;
}

6. 项目六

题目

  • Description
    给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
    1:两个字符串长度不等。比如Beijing和Hebei
    2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如Beijing和Beijing
    3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如beijing和BEIjing
    4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如Beijing和Nanjing
    编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
  • Input
    包括两行,每行都是一个字符串
  • Output
    仅有一个数字表示关系编号。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<string>
using namespace std;
void consion(string &str)//大写变小写
{
for(size_t i=0;i<str.size();i++)
{
if(str[i]>='A'&&str[i]<='Z')
str[i]=str[i]+32;
}
}
int judge(string str1,string str2)
{
if(str1.size()!=str2.size()) return 1;
if(str1==str2) return 2;
if(str1!=str2)
{
consion(str1);
consion(str2);
if(str1==str2) return 3;
else return 4;
}
}
int main()
{
string a,b;
cin>>a>>b;
cout<<judge(a,b);
return 0;
}