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

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

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


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]);//输出没有被标记的字符
  }
}
目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 C语言
【C/PTA】循环结构进阶练习(三)
【C/PTA】循环结构进阶练习(三)
310 0
|
5月前
|
存储 编译器 C语言
【C语言刷题每日一题#牛客网BC107】矩阵转置
【C语言刷题每日一题#牛客网BC107】矩阵转置
|
6月前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
6月前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
ACM刷题之路(十四)逆元取模 Travel along the Line
ACM刷题之路(十四)逆元取模 Travel along the Line
|
6月前
|
机器学习/深度学习
【C/PTA】数组进阶练习(一)
【C/PTA】数组进阶练习(一)
130 0
|
6月前
|
机器学习/深度学习 人工智能
【C/PTA】数组进阶练习(三)
【C/PTA】数组进阶练习(三)
223 0
|
6月前
|
BI
【C/PTA】数组练习(编程)
【C/PTA】数组练习(编程)
239 0
|
6月前
|
人工智能 BI
【C/PTA】结构体进阶练习
【C/PTA】结构体进阶练习
56 0
|
6月前
|
测试技术 数据安全/隐私保护
【C/PTA】数组进阶练习(二)
【C/PTA】数组进阶练习(二)
133 0