倒置字符串-两种解法

综述:倒置字符串这个题看起来不是很容易做,实际做起来也不是很容易,本文以两种方式来做这个题,一个方式简单但是不一定容易想,另一种方式可能比较难一些但是可能比较容易想到。

目录

题目:

输入描述:

输出描述:

解法一:

解法1代码实现:

解法2:

解法2代码实现:


题目:

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:

每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100

输出描述:

依次输出倒置之后的字符串,以空格分割

解法一:

解法1的思路是分两步

1、整个字符串逆置顺序

2、每个单词再逆置顺序

        例如题中所给测试用例:I like beijing. 按照解法1思路是这样做,先把整个字符串逆置得到:.gnijieb ekil l ,然后对每个单词再单独逆置就变成了:beijing. like I,这样就算逆置过来了,有了思路之后就是代码的编写了。

解法1代码实现:

        代码有了思路之后代码实现起来不是太难,一个是逆置字符串封装的函数,就是知道字符串的开头和末尾,然后挨个换就可以了,主要部分是逆置整个字符串之后再逆置这个字符串包含的以空格分隔的单词。我们在程序中以两个指针来找单词的开头和结尾并作为reverse函数的参数,一个是start,另一个是cur,每次cur找到空格或者cur走到了'\0'时,就找到了单词的末尾cur-1,逆置完更新start的值变为cur+1,cur自增。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void reverse(char* left, char* right)
{
    while (left < right)
    {
        char tmp = *right;
        *right = *left;
        *left = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[101] = { 0 };
    gets(arr);
    char* start = arr;
    char* end = arr + strlen(arr)-1;
    reverse(start, end);
    char* cur = arr;
    while (*cur != '\0')
    {
        while (*cur != ' ' && *cur != '\0')
        {
            cur++;
        }
        reverse(start, cur - 1);
        start = cur + 1;
        cur+=1;

    }
    printf("%s\n", arr);
    return 0;
}

解法2:

        解法二的思路是这样先用cur指向字符串的末尾,然后往前走,找到空格时,printf一下,以%s格式,这样打印只需要给字符串的首地址,它打印到\0停下。我们打印完一个单词后,把cur的位置变成\0,然后继续往前走,直到数组开始位置。

        例如题中所给测试用例:I like beijing. 按照解法2思路是这样做:

 

解法2代码实现:

        cur指针开始指向字符串最后一个字符,然后往前遍历,直到空格或者cur到了最开始的字符位置,这里分两种情况,到空格位置,要把空格位置变成\0,打印cur+1位置,到首字符,打印cur位置。

        其中需要注意一点,我们把空格位置变成了\0,所以在第一种情况需要打印的时候在加个空格

#include <stdio.h>

int main()
{
    char arr[101]={0};
    gets(arr);
    char* cur =arr+strlen(arr)-1;
    while(cur>arr)
    {
        while(*cur!=' '&&cur>arr)
        {
            cur--;
        }
        
        if(cur==arr)
        {
            printf("%s",cur);
        }
        else
        {
            printf("%s ",cur+1);
            *cur='\0';
        }
    }
    return 0;
}

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝士就是菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值