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


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

    7-1 字符串逆序

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

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

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

    Hello World!

    输出样例:

    !dlroW olleH

    方法一:数组实现

    #include 
    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]);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    方法二:引入gets及strlen

    #include 
    #include 
    int main()
    {
    	char a[80];
    	gets(a);
    	
    	for(int i=strlen(a)-1;i>=0;i--)
    	printf("%c",a[i]);
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    7-2 字符串替换

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

    原字母 	对应字母
    A 	Z
    B 	Y
    C 	X
    D 	W
    … 	…
    X 	C
    Y 	B
    Z 	A
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输入格式:

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

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

    Only the 11 CAPItaL LeTtERS are replaced.

    输出样例:

    Lnly the 11 XZKRtaO OeGtVIH are replaced.

    #include 
    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]);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    7-3 统计字符出现次数

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

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

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

    programming is More fun!
    m

    输出样例:

    2

    方法一:数组实现

    #include 
    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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    方法二:引入gets及strlen

    #include 
    #include 
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    7-4 IP地址转换

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

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

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

    11001100100101000001010101110010

    输出样例:

    204.148.21.114

    #include 
    #include 
    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--;
    	}
    }
    
    • 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

    7-1 删除重复字符

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

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

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

    ad2f3adjfeainzzzv

    输出样例:

    23adefijnvz

    #include 
    #include 
    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]);
    	}
    		
    }
    
    • 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

    7-2 说反话-加强版

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

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

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

    Hello World Here I Come

    输出样例:

    Come I Here World Hello

    #include
    #include
    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--;
        }
    }
    
    • 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

    7-3 数组-回文串

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

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

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

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

    输入样例1:
    3
    abcabc
    AbbbbA
    cccc

    输出样例1:
    AbbbbA
    cccc

    #include 
    #include 
    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);
    	}
    }
    
    • 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

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

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

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

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

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

    2
    abcd
    sama

    输出样例:

    dcba
    amas

    #include 
    #include 
    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");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    7-5 数组-文本加密

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

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

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

    ccAAbB,AAyyZz

    输出样例:

    Yes

    #include 
    #include 
    #include 
    
    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");
        }
    }
    
    
    • 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

    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 
    #include 
    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]);//输出没有被标记的字符
    	}
    }
    
    • 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
  • 相关阅读:
    ExecutorService、Callable、Future实现有返回结果的多线程原理解析
    基于JAVA线上订餐系统计算机毕业设计源码+数据库+lw文档+系统+部署
    软件测试—测试用例的设计
    1+X 职业技能考核平台
    Attentional Feature Fusion 注意力特征融合
    【Python】批量提取图片经纬度并写入csv文件
    LeetCode //C++ - 427. Construct Quad Tree
    SAP FI 系列 (033) - 应收票据的接收和承兑
    SpringCloud Alibaba微服务第4章Docker安装Nacos
    回归损失和分类损失
  • 原文地址:https://blog.csdn.net/2301_77485708/article/details/134445621