首页 > 试题广场 >

句子逆序

[编程题]句子逆序
  • 热度指数:501410 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”

所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

数据范围:输入的字符串长度满足

注意本题有多组输入

输入描述:

输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。



输出描述:

得到逆序的句子

示例1

输入

I am a boy

输出

boy a am I
示例2

输入

nowcoder

输出

nowcoder
//里面有注释,应该可以辅助记忆。
#include <ctype.h>
#include <stdio.h>
#include <string.h>

/*
 * ch[]:要被逆序的数组,start:逆序操作的起始位置,end:逆序操作的结束位置。
*/
int proc(char ch[], int start, int end) {
    // 检查输入参数
    if (ch == NULL || start >= end) {
        return -1; // 输入参数错误
    }

    // 逆序操作
    for (int i = start, j = end; i < j; i++, j--) {
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
    }

    return 1; // 成功执行逆序
}

void print(char a[]) {
    int len = strlen(a);
    for (int i = 0; i < len; i++) {
        printf("%c", a[i]);
    }
    printf("\n");
}

int main() {
    char arr[1002] = "\0";
    int slow = 0, fast = 0; //快慢Flag,辅助标记用

    fgets(arr, sizeof(arr), stdin);
    arr[strcspn(arr, "\n")] = '\0';

    int len = strlen(arr);
    int i = 0;

    //确保每一个数组元素是字符或空格
    for (i = 0; i < len; i++) {
        if ( !(isalpha(arr[i]) || isblank(arr[i])) ) {
            return -1;
        }
    }

    //第一次处理,先反转全部字符串
    proc(arr, 0, len - 1);

    //第二次处理,反转每个单词。初始slow和fast都是零。
    for (i = 0; i < len; i++) {
        if (arr[i] == ' ') {
            fast = i - 1; //快游标拿到一个单词的末尾游标值
            proc(arr, slow, fast);
            slow = i + 1;
        }
    }

    //这一步是反转最后一个单词,此时特殊在 slow < len-1 ,且因为上一步的for循环循环到最后时,
    //最后一个元素不是空格而是\n了,所以此时直接反转从 slow 到 len-1 的元素即可。
    if(slow < len - 1) {
        proc(arr, slow, len - 1);
    }

    print(arr);

    return 0;
}


编辑于 2024-04-07 22:11:27 回复(0)
#include <stdio.h>
#include <string.h>
struct stringarr{
    int index;
    char word[100];
};
int main() {
    char inputdata[100];
    struct stringarr str1[100];
    int i=0;
   
    while(scanf("%s",str1[i].word)!=EOF)
    {
        str1[i].index=i;
        i++;
    }
    int max =i-1;

    for(i=max;i>=0;i--)
    {   if(i==0)
        {
            printf("%s",str1[i].word);
        }
        else {
            printf("%s ",str1[i].word);
        }

    }
    return 0;
}
编辑于 2024-03-27 16:21:09 回复(0)
#include <stdio.h>
#include <string.h>
int main()
{
    char str[1001];
    fgets(str,1001,stdin);
    int len=strlen(str);
    int count=0;
    for(int i=0;i<len;i++)
        if(str[i]==' ')
            count++;
    int p1 = len - 2, p2 = len - 2;
    /*fgets函数会在输入的字符串后面自动加\0,统计字符串长度时也会把\0算一个字符。如果用的是gets函数则不会把\0算进字符串长度*/
    for(int j=0;j<=count;j++)
    {
        while(str[p1]!=' '&&p1>=0)
            p1--;
        for(int k=p1+1;k<=p2;k++)
            printf("%c",str[k]);
        printf(" ");
        p1--;
        p2=p1;
    }
    return 0;
}
编辑于 2024-03-10 17:18:23 回复(0)
#include <stdio.h>

int main() {
    char a[200][30];
    int i=0,j;
    while (scanf("%s",a[i]) != EOF) 
    {
        i++;
    }
    for(j=i-1;j>=0;j--)
    {
        if(j==0) printf("%s",a[j]);
        else printf("%s ",a[j]);
    }
    return 0;
}

发表于 2024-02-15 10:02:35 回复(0)
//为什么我的代码慢别人三倍……
#include <stdio.h>
int main() {
    char a[1002],c=getchar();int i=0,j;a[i++]=' ';
    while (c!='\n') {
        a[i++]=c;c=getchar();
    }
    a[i]=' ';
    while (i) {
    for(j=--i;a[j]!=' ';j--);
    i=j;
    while(a[++i]!=' ')
    putchar(a[i]);
    i=j;
    putchar(' ');
    }
    return 0;
}
编辑于 2023-12-07 11:00:28 回复(0)
#include <stdio.h>
#include <string.h>
int main() {
    int a, b;
    char str[1002];
    gets(str);
    int i,j;
    int len = strlen(str);
    j = len-1;
    for(int  i =len-1; i>=0; i--)
    {
        if(str[i]==' ')
        {  
            for(a = i+1; a <=j;a++)
            {
                printf("%c",str[a]);
            }
            printf(" ");
            j = i-1 ;
        }
        if(i==0)
        {
            for(a = i; a <=j;a++)
            {
                printf("%c",str[a]);
            }
        }
    }
    return 0;
}
发表于 2023-11-30 15:47:18 回复(2)
关键点:关键是对字符串中空格字符的使用。
思路:从后往前遍历每个字符,遇到空格则将空格换为\0,并打印从空格起的字符串
注意点:单独处理第一个单词。
缺点:这种做法改变了原始字符串的内容。若不想改变,就不替换空个格,打印的时候计算单词长度进行字符打印  。
#include <stdio.h>

int main() {
    int len;
    char str[1001] ={0};
    gets(str);
    len = strlen(str);
    while(len--)
    {
        if(str[len] == ' ')
        {
            printf("%s ", &str[len + 1]);
            str[len] = '\0';
        }
    }
    printf("%s", str);
    return 0;
}


发表于 2023-11-25 17:19:09 回复(0)
#include <stdio.h>
/*思路:把单词依次存入字符串数组,然后逆序输出字符串*/

int main() {
    char word[1000][1000]={0};
    int n = 0;
    while (scanf("%s", word[n++]) != EOF){}
    for (int i = n - 2; i >= 0; i--) { // n-2是因为最后输入'\n'时n也会+1
        printf("%s ", word[i]);
    }
    return 0;
}

发表于 2023-11-09 13:12:39 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str[1001]={0};
    gets(str);
    int len=strlen(str);
    for(int i=len-1;i>=0;i--)
    {
        if(str[i]==' ')//空格位置
        {
            int blank=i;
            while ((str[++blank]!=' ')&&(blank<len)) //输出此单词
            {
                printf("%c",str[blank]);
            }
            printf(" ");//输出此空格
        }
    }
    int f=0;
    while(str[f]!=' ')//第一个单词
    {
        printf("%c",str[f]);
        f++;
    }
    return 0;
}
发表于 2023-09-02 21:46:50 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str[1000];
    gets(str);
    for(int i=strlen(str)-1; i>0; i--){
        if(str[i] == ' ') {
            str[i] = '\0';
            printf("%s ", &str[i+1]);
        }
    }
    printf("%s ", str);
    return 0;
}

获取字符串从后往前遍历到第2个字符,遇到空格将其替换为结束符'\0',然后将后面字符串打印出来,最后将剩下的最后一个字符串打印出来

发表于 2023-05-11 11:57:00 回复(0)
#include <stdio.h>

int main() {

    char sts[501][30] = { 0 };
    int i = 0;
    while(~scanf("%s",sts[i])){
        i++;
    }
    for(i -= 1 ; i >= 0 ; i--){
        printf("%s ",sts[i]);
    }
    return 0;
}

//标签是数组,那就用数组~

发表于 2023-03-31 15:28:52 回复(1)
#include <stdio.h>
#include <string.h>

int main() {
    char str[1024] = {0};
    while (scanf("%[^\n]\n", str) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to
        for (int i  = (strlen(str) - 1); i >= 0; i --)
        {
            if (' ' == str[i]) {
                printf("%s ", &str[i + 1]);
                str[i] = '\0';
            }
        }

        printf("%s\n", str);
    }
    return 0;
}
发表于 2023-03-27 08:15:06 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str[1000] = {0};
    gets(str);

    int len = strlen(str);
    int len2 = 0; //记录一个的单词长度
    for (int i = len - 1; i >= 0; i--) {//从后往前扫描字符
        if (str[i] !=' ') { 
            len2++;
        } else {
            for (int j = 0; j < len2; j++) 
                printf("%c", str[i + 1 + j]);
            printf(" ");
            len2 = 0;
        }
    }
 
    if (len2 != 0) {//打印最后一个单词
        for (int k = 0; k < len2; k++) 
            printf("%c", str[k]);
    }

    return 0;
}

发表于 2023-02-02 23:30:58 回复(0)
我的思路是先获取空格位置,然后先输出最后一个单词,中间用空格为标志逆序输出单词,最后输出第一个单词,但是为什么在线自测不通过啊,我在本地编译器随便试了好多个都能正常输出啊,哪位牛友指点一下吗?

#include <stdio.h>
int main() {
    int i, j = 0, len, s[100];
    char str[1000];
    gets(str);
    //scanf("%s", str);
    len = strlen(str);
    for (i = 1; i <= len; i++)
        if (str[i] == ' ') {
            s[j] = i;
            j++;
        }
    j = j - 1;

            //输出最后一个单词
    for (i = s[j]; i < len; i++)
        printf("%c", str[i + 1]); 
          //逆序输出中间部分单词
    for (j; j > 0; j--) { 
        for (i = s[j - 1]; i < s[j]; i++)
            printf("%c", str[i + 1]);
    }
          //输出第一个单词
    for (i = 0; i < s[0]; i++)
        printf("%c", str[i]);
	printf("\n");
    return 0;
}

发表于 2023-01-07 18:54:11 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char arr[1001]={};
    gets(arr);
    int len=strlen(arr);
    int count=0;
    for(int i=len-1;i>=0;i--){
        if(arr[i]==' '){
            if(count==0){
                printf("%s",&arr[i+1]);
                arr[i]='\0';
                count=1;
            }
            else{
                printf(" %s",&arr[i+1]);
                arr[i]='\0';
            }
        }
    }
    if(count==0)
        printf("%s\n",&arr[0]);
    else
        printf(" %s\n",&arr[0]);
    return 0;
}
重点在于处理好scanf("%s")和printf("%s")之间的关系,前者读到空格会直接结束,后者读到'\0'才结束,也是说,需要在读到空格输出的时候将对应的空格转换成‘\0’。
发表于 2023-01-01 17:43:03 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    char a[1002]={' '};
    gets(a+1);
    int len=strlen(a+1);
    int l,r=len;
    for(l=len;l>=1;l--)
    {
        if(a[l-1]==' ')
        {
            for(int i=l;i<=r;i++)
              printf("%c",a[i]);
            printf(" ");
            r=l-2;
            l--;
        }
    }
    return 0;
}
发表于 2022-07-18 16:57:20 回复(1)
#include <stdio.h>

int main()
{
  char buf[1000] = {0};
  int i;
  
  gets(buf);
  
  for(i = strlen(buf) - 1; i; i--)
  {
    if(buf[i] == ' ')
    {
      printf("%s ",&buf[i + 1]);
      buf[i] = 0;
    }
  }
  
  printf("%s",&buf[0]);
}

发表于 2022-06-29 17:58:20 回复(1)