首页 > 试题广场 >

多组_带空格的字符串_T组形式

[编程题]多组_带空格的字符串_T组形式
  • 热度指数:9171 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定 t 组询问,每次给出一个长度为 n 的带空格的字符串 s ,请你去掉空格之后,将其倒置,然后输出。

输入描述:
第一行有一个整数 t\ (\ 1 \leq t \leq 10^5\ )
随后 t 组数据。
每组的第一行有一个整数 n\ (\ 1 \leq n \leq 10^5\ )
每组的第二行有一个字符串 s,仅包含小写英文字符和空格,保证字符串首尾都不是空格。
保证 \sum n \leq 10^5


输出描述:
输出 t 行,每行一个字符串,代表倒置后的字符串 s
示例1

输入

3
9
one space
11
two  spaces
14
three   spaces

输出

ecapseno
secapsowt
secapseerht
字符串的题目与一般题目相比难度会有所提升,还得注意每个字符间的空格和换行符,我的解法不算是基础解法,所以我基本每句都写了注释,主要思路还是先用循环去除空格,再用循环将字符串的顺序颠倒,如果不熟悉指针,也可以不用函数,就直接在main函数中进行循环。
#include <stdio.h>
#include <string.h>// 使用字符串数据库
#define max_l 100005//定义最大测试长度
void a(char *str, char *newStr)//去除字符串中的空格
{
    int j = 0;// 定义一个存储空格数的值
    for (int i=0;str[i]!='\0';i++)// 循环检测空格
    {//若不为空格,则将其复制到newStr中,并递增j,间接去除了空格
        if (str[i]!=' ')
        {
            newStr[j]=str[i];
            j++;
        }
    }
    newStr[j]='\0';// 处理完毕,在末尾添加结束字符,得到不含空格的字符串
}
// 反转字符串
void b(char *str)
{
    int len=strlen(str);//通过strlen函数得到处理后的字符串的长度,从而确定循环次数
    for (int i=0;i<len/2;i++)//将前半部分与后半部分的字符互换,故只需要循环字符串长度的一半
    {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}
int main(void)
{
    int t;//定义需要测试的组数
    scanf("%d",&t);
    for (int k=0;k<t;k++)
    {
        int n;//定义输入带空格字符串的长度
        scanf("%d",&n);
        getchar();//读取输入结束后的换行符
        char l[max_l];//定义一个能存储最大长度字符串的数组
        fgets(l, max_l, stdin);//这里之所以不用n作为被读取字符串的长度,是为了统一fgets读取的长度,因为n不是固定不变的,会使计算内容变得麻烦,且用最大长度可避免输入字符的长度超过n的情况,避免出现崩溃的情况
        l[strcspn(l,"\n")]='\0';//将读取到的换行符换为结束符,从而达到分开每组数据的条件
        char nl[max_l];//定义一个数组,存储去除空格后的字符串
        a(l, nl);//进入去除字符串中空格的函数
        b(nl);//进入反转处理后的字符串的函数
        printf("%s\n", nl);//输出结果
    }
    return 0;
}
发表于 2025-02-24 20:57:24 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
int t;
int len;
char *ptr = NULL;
char *s = NULL;

scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%d\n", &len);
ptr = malloc(len + 1);
s = malloc(len + 1);
scanf("%[^\n]", ptr);
int row = 0;
for (int index = len - 1; index >= 0; index--) {
if (ptr[index] != ' ') {
s[row++] = ptr[index];
}
}
printf("%s\n", s);
// 需要将申请的内存块清空,否则可能发生不可预料的结果
memset(ptr, 0, len + 1);
memset(s, 0, len + 1);
free(ptr);
free(s);
ptr = NULL;
s = NULL;
}
}
发表于 2024-10-31 23:02:37 回复(0)