【C/PTA】数组进阶练习(二)

本文结合PTA专项练习带领读者掌握数组,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

目录

    • 7-1 字符串逆序
    • 7-2 字符串替换
    • 7-3 统计字符出现次数
    • 7-4 IP地址转换
    • 7-1 删除重复字符
    • 7-2 说反话-加强版
    • 7-3 数组-回文串
    • 7-4 数组-无聊的菇菇一族
    • 7-5 数组-文本加密
    • 7-6 数组-动车上

7-1 字符串逆序

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:

在一行中输出逆序后的字符串。
输入样例:

Hello World!

输出样例:

!dlroW olleH

方法一:数组实现

#include <stdio.h>
int main()
{
	char c,a[80];
	int i=0;
	while((c=getchar())!='\n')
	{
		a[i]=c;
		i++;
	}
	
	for(int j=i-1;j>=0;j--)
	{
		printf("%c",a[j]);
	}
}

方法二:引入gets及strlen

#include <stdio.h>
#include <string.h>
int main()
{
	char a[80];
	gets(a);
	
	for(int i=strlen(a)-1;i>=0;i--)
	printf("%c",a[i]);
	
}

7-2 字符串替换

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母 	对应字母
A 	Z
B 	Y
C 	X
D 	W
… 	…
X 	C
Y 	B
Z 	A

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:

输出在一行中给出替换完成后的字符串。
输入样例:

Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

Lnly the 11 XZKRtaO OeGtVIH are replaced.

#include <stdio.h>
int main()
{
	char c,a[80],b[80];
	int i=0;
	while((c=getchar())!='\n')
	{
		a[i]=c;
		i++;
	}
	
	for(int j=0;j<=i-1;j++)
	{
		if(a[j]>='A'&&a[j]<='Z')
		{
			b[j]='A'+'Z'-a[j];
		}
		else 
		b[j]=a[j];
		
		printf("%c",b[j]);
	}
}

7-3 统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:

在一行中输出给定字符在给定字符串中出现的次数。
输入样例:

programming is More fun!
m

输出样例:

2

方法一:数组实现

#include <stdio.h>
int main()
{
	char a[80],c,d;
	int i=0,count=0;
	while((c=getchar())!='\n')
	{
		a[i]=c;
		i++;
	}
	d=getchar();
	
	for(int j=i-1;j>=0;j--)
	{
		if(d==a[j])
		count++;
	}
	printf("%d",count);
}

方法二:引入gets及strlen

#include <stdio.h>
#include <string.h>
int main()
{
	char a[80],c;
	int count=0;
	
	gets(a);
	c=getchar();
	
	for(int i=0;i<strlen(a);i++)
	{
		if(a[i]==c)
		{
			count++;
		}
	}
	printf("%d",count);
}

7-4 IP地址转换

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入格式:

输入在一行中给出32位二进制字符串。
输出格式:

在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。
输入样例:

11001100100101000001010101110010

输出样例:

204.148.21.114

#include <stdio.h>
#include <math.h>
int main()
{
	char a[33];
	int t=7;//当前处理的二进制位在8位中的位置
	int sum=0;//当前部分的十进制结果
	
	gets(a);
	for(int i=0;i<32;i++)
	{
		a[i]=a[i]-48;//将字符型的'0'~'1'转换成对应的整型数0~1
		sum+=a[i]*pow(2,t);
		
		if(t==0)//如果是8位中的最后一位
		{
		printf("%d",sum);
		t=7;
		sum=0;
		if(i!=31)
		printf(".");
		}
		else
		t--;
	}
}

7-1 删除重复字符

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:

输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:

输出去重排序后的结果字符串。
输入样例:

ad2f3adjfeainzzzv

输出样例:

23adefijnvz

#include <stdio.h>
#include <string.h>
int main()
{
	char a[80];
	gets(a);
	for(int i=0;i<strlen(a)-1;i++)
	{
		for(int j=0;j<strlen(a)-1;j++)
		{
			if(a[j]>a[j+1])
			{
				char t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}//冒泡排序得到abccc
	
	
	//如果前后不一致就打印出来 所以得到abc
	for(int i=0;i<strlen(a);i++)
	{
		if(a[i]!=a[i+1])
		printf("%c",a[i]);
	}
		
}

7-2 说反话-加强版

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

#include<stdio.h>
#include<string.h>
int main()
{
    char a[500001],b[500001];
    gets(a);  // 输入字符串
    int i,c,j;

 
    int count=0;
    for(i=0;a[i]==' ';i++)  // 计算开头的连续空格数
    {
        count++;
    }
 
    for(i=strlen(a)-1;i>=0;)
    {
        if(a[i]!=' ')
        {
            c=0;
            b[0]='\0';
            while(a[i]!=' '&&i>=0)  // 提取单词
            {
                b[c++]=a[i--];
            }
            //类似于把come中e、m、o、c分别放入b数组
            //此时b数组为emoc,将其逆序输出即可
            
            for(j=c-1;j>=0;j--)  // 逆序输出单词
            {
                printf("%c",b[j]);
            }
 
            if(count==i+1) ;  // 如果开头有空格则不输出
            else printf(" ");  // 输出单词之间的空格
        }
        else i--;
    }
}

7-3 数组-回文串

回文串是正着读和反着读都一样的字符串,例如“level”“noon”这些都是回文串,
现在希望你能找出输入的所有字符串中的回文串。
输入格式:

第一行为一个正整数N(0 < N <= 1000),表示有N个字符串,

接下来N行每行都是一个字符串(每个字符串长度不超过1000)。
输出格式:

输出所有是回文串的字符串,每输出一个字符串输出一个回车,包括最后一个字符串。

输入样例1:
3
abcabc
AbbbbA
cccc

输出样例1:
AbbbbA
cccc

#include <stdio.h>
#include <string.h>
int main()
{
	int n;scanf("%d",&n);
    getchar();//读取数字到字符串的换行符 避免回车的影响
	
	
	for(int i=0;i<n;i++)
	{
		char a[1001];
		gets(a);
		int len=strlen(a);
		if(a[len-1]=='\n')//将字符串到字符串的换行符去掉
		{
			a[len-1]='\0';
			len--;
		}
		
		int flag=0;
		for(int i=0;i<len/2;i++)
		{
			if(a[i]!=a[len-i-1])
			{
				flag=1;
				break;
			}
		}
		if(flag==0)
		printf("%s\n",a);
	}
}

7-4 数组-无聊的菇菇一族

戈壁上只居住着菇菇一族们,于是菇菇们实在太无聊了,除了吃饭,睡觉,菇菇们天天都无所事事。于是菇菇们想出了一个方法来消磨时间。菇菇们分成几组,每组按一定顺序排列,按从最后一个到第一个的顺序报出菇菇们的名字。报错的一组菇菇将要接受打理节操田地一周的惩罚(太可怕了>.<)。你能帮帮他们么?
输入格式:

第一行包括一个正整数N,表示有N组菇菇。

接下来N行每行包含一个字符串(长度小于100,仅包含小写字母),每个字母表示一个菇菇的名字。
输出格式:

输出N行,每行为该组菇菇报名字的顺序。
输入样例:

2
abcd
sama

输出样例:

dcba
amas

#include <stdio.h>
#include <string.h>
int main()
{
	int n;scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++)
	{
		char a[100];
		gets(a);
		for(int i=strlen(a)-1;i>=0;i--)
		{
			printf("%c",a[i]);
		}
		printf("\n");
	}
}

7-5 数组-文本加密

某特工提供了一段文本,按照以下规则对逐个字符进行加密(称为密文):首先将大小写进行切换(大写转换成小写、小写转换成大写),之后再将字母替换成字母表中两位之前的字母,如‘c’替换成‘a’,‘b’替换成‘z’,‘A’替换成‘Y’。同时,该特工也提供了该密文的解析,请判断该解析是否正确。
输入格式:

输入仅一行,包含两个字符串,中间以一个逗号“,”隔开。每个字符串的长度分别不超过10000个字符,仅包含26个字母(含大小写字母‘a’-‘z’和大写字母‘A’-‘Z’),且保证两个字符的长度相等。
输出格式:

判断密文解析是否正确,正确则输出“Yes”,错误则输出“No”。
输入样例:

ccAAbB,AAyyZz

输出样例:

Yes

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char a[10001], b[10001], c[10001];
    scanf("%[^,],%s",a,b);

    int len=strlen(a);
    for (int i=0;i<len;i++) 
	{
        // 切换大小写
        if (isupper(a[i])) 
            c[i]=tolower(a[i]);
		else
            c[i]=toupper(a[i]);
    
        // 字母替换
        if(isalpha(a[i]))
            if(c[i]=='A'||c[i]=='B'||c[i]=='a'||c[i]=='b')
                c[i]=c[i]+24;
            else if((c[i]>='C'&&c[i]<='Z')||(c[i]>='c'&&c[i]<='z'))
                c[i]=c[i]-2;
    }
    c[len] = '\0';

    if(strcmp(b,c)==0) 
	{
    printf("Yes");
    }
	else 
	{
    printf("No");
    }
}

7-6 数组-动车上

就这样,阿翔和阿花分手了,阿翔独自一人登上了开往福大的动车……

阿翔刚在自己的座位上坐下,便听到一声问候:“同学,你好。”阿翔扭过头一看,见身旁是一美女,内心暗喜,吞吞吐吐地说:“你……你好……请问有什么事么?”女生说:“能不能麻烦你和我的朋友换个位置?”阿翔一愣,顺着她所指方向望去,见一帅哥。阿翔强装笑颜,答道:“好的。”

阿翔坐在帅哥的座位上,耳边萦绕着那对情侣的欢声笑语。他默默地从书包里掏出那叠英语卷。这一次,为了证明自己的帅气,阿翔要更华丽地调教这些考卷——

对于一个字符串S,设其第i个字符为Si,将每k个连续字符划分为一组,则{S0,S1,…,S(k-1)}为第0组,{Sk,S(k+1),…,S(2k-1)}为第1组,以此类推。阿翔要做的就是将第i组(i从0开始)字符逆置i次(逆置即倒序,如将abc置为cba)。若字符串剩下的字符不够凑成一组,则不对这些字符进行操作。

输入格式:
第一行为一个正整数k(大小不限,可能超过字符串长度);
第二行为一个字符串(长度不超过100,不含空格)。

输出格式:
输出仅一行,即完成操作后所得的字符串。

输入样例:
5
qwertyuiopasdfghjkl

输出样例:
在这里给出相应的输出。例如:
qwertpoiuyasdfghjkl

#include <stdio.h>
#include <string.h>
int main()
{
	int k;char c[101];scanf("%d",&k);scanf("%s",c);
	int len=strlen(c);
	int a[101]={0};//用于记录字符是否被输出过
	int groupcount=len/k-1;//计算分组数量
	int j,i;
	
	for(j=0;j<=groupcount;j+=2)
	{
		//输出每组的前k个字符
		for(i=j*k;i<(j+1)*k;i++)
		{
			if(i>=len)
			break;
			printf("%c",c[i]);
			a[i]++;
		}
		

//逆序输出每组的后k个字符
	for(i=(j+2)*k-1;i>=(j+1)*k;i--)
	{
		if(i>=len)
		break;
		printf("%c",c[i]);
		a[i]++;
	}
}
	

	
	for(i=0;i<len;i++)
	{
		if(a[i]==0)
		printf("%c",c[i]);//输出没有被标记的字符
	}
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐