LeetCode 20天算法刷题计划第四天:双指针(3)

前言

hello,大家好,这篇博客我们来继续分享LeetCode 20天算法刷题计划(点击跳转LeetCode20天算法刷题计划)第四天的两道题目。用到的知识点还是双指针。闲言少叙,让我们开始吧。

1. 344 反转字符串

1.1 题目链接

https://leetcode-cn.com/problems/reverse-string/

1.2 题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

在这里插入图片描述

1.3 题目分析

这道题目是字符串反转,其实我们思考一下可以发现,所谓的反转,就是将第一个字符与最后一个字符互换位置,第二个字符与倒数第二个字符互换位置,以此类推。所以,我们可以想到,这道题目可以用双指针来实现,最后变成两个元素的位置的交换。
动画演示如下:
在这里插入图片描述

1.4 代码实现

void swap(char *a, char *b) {
    char t = *a;
    *a = *b, *b = t;
}

void reverseString(char *s, int sSize) {
    for (int left = 0, right = sSize - 1; left < right; ++left, --right) {
        swap(s + left, s + right);
    }
}

1. 557 反转字符串中的单词III

2.1 题目链接

https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/

2.2 题目描述

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

在这里插入图片描述

2.3 题目分析

这道题和上一道题目类似,但是难度比上一道题目更大,因为我们要反转的是单词,而不是字母。空格是这道题解决的一个重要突破口。我们知道单词是以空格划分的,如果我们开辟出一块与原字符串等大的空间,然后用指针遍历原字符串,遇到空格后就代表一个单词结束,然后把该单词放到新开辟的空间的对应末未,这样一次找到每一个单词,也就完成了语句的逆序。

2.4 代码实现

char* reverseWords(char* s) {
    int length = strlen(s);
    char* ret = (char*)malloc(sizeof(char) * (length + 1));
    ret[length] = 0;
    int i = 0;
    while (i < length) {
        int start = i;
        while (i < length && s[i] != ' ') {
            i++;
        }
        for (int p = start; p < i; p++) {
            ret[p] = s[start + i - 1 - p];
        }
        while (i < length && s[i] == ' ') {
            ret[i] = ' ';
            i++;
        }
    }
    return ret;
}

后记

好的,今天我们的博文就分享到这里啦,希望对大家有所帮助。日拱一卒,继续努力。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lxkeepcoding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值