《算法零基础100讲》(第25讲) 字符串算法(五) - 字符串反转《解题报告》

《算法零基础100讲》(第25讲) 字符串算法(五) - 字符串反转_英雄哪里出来-CSDN博客

字符串的反转经常会出现在各种题中,现在介绍两种c++反转字符串的方法.

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char s[10000];
    cin>>s;
    strrev(s);//cstring库函数里的
    cout<<s<<endl;
    return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    string s;
    cin>>s;
    reverse(s.begin(),s.end());//algorithm库函数
    cout<<s<<endl;
    return 0;
}

344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com) 

void reverseString(char* s, int sSize){
    for (int i = 0; i < sSize / 2; i++) {//对半分
        char c = s[i];//交换下标
        s[i] = s[sSize -i - 1];
        s[sSize -i - 1] = c;
    }
}

2000. 反转单词前缀 - 力扣(LeetCode) (leetcode-cn.com)

给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。

例如,如果 word = "abcdefd" 且 ch = "d" ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 "dcbaefd" 。
返回 结果字符串 。

示例 1:

输入:word = "abcdefd", ch = "d"
输出:"dcbaefd"
解释:"d" 第一次出现在下标 3 。 
反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "dcbaefd" 。

示例 2:

输入:word = "xyxzxe", ch = "z"
输出:"zxyxxe"
解释:"z" 第一次也是唯一一次出现是在下标 3 。
反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "zxyxxe" 。

示例 3:

输入:word = "abcd", ch = "z"
输出:"abcd"
解释:"z" 不存在于 word 中。
无需执行反转操作,结果字符串是 "abcd" 。
 

提示:

1 <= word.length <= 250
word 由小写英文字母组成
ch 是一个小写英文字母

 第一种c++stl

class Solution {
public:
    void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
    }
};

第二种众人皆知

class Solution {
public:
    void reverseString(vector<char>& s) {
int len=s.size()-1;
int l=0;
while(l<len)
{
    swap(s[l++],s[len--]);//将前后字母全部交换
}
    }
};

7. 整数反转 - 力扣(LeetCode) (leetcode-cn.com)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。
 

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0
 

提示:

-231 <= x <= 231 - 1

class Solution {
public:
    int reverse(int x) {
long t=0;
while(x)
{
    t=t*10+x%10;
    x=x/10;
}
return (t>INT_MAX||t<INT_MIN)?0:t;//c++,limits函数库
    }
};

2000. 反转单词前缀 - 力扣(LeetCode) (leetcode-cn.com)

给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。

例如,如果 word = "abcdefd" 且 ch = "d" ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 "dcbaefd" 。
返回 结果字符串 。

示例 1:

输入:word = "abcdefd", ch = "d"
输出:"dcbaefd"
解释:"d" 第一次出现在下标 3 。 
反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "dcbaefd" 。

示例 2:

输入:word = "xyxzxe", ch = "z"
输出:"zxyxxe"
解释:"z" 第一次也是唯一一次出现是在下标 3 。
反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "zxyxxe" 。

示例 3:

输入:word = "abcd", ch = "z"
输出:"abcd"
解释:"z" 不存在于 word 中。
无需执行反转操作,结果字符串是 "abcd" 。
 

提示:

1 <= word.length <= 250
word 由小写英文字母组成
ch 是一个小写英文字母

 这里需要了解find函数,string自带的函数find(),可查找指定字符串和指定字符。

使用方法:例如在string1中查找string2,string1.find(string2);

返回值为string2第一次在string1出现的位置。

如果希望在特定位置开始查找,可以使用string1.find(string2,location);

class Solution {
public:
    string reversePrefix(string word, char ch) {
        reverse(word.begin(),word.begin()+word.find(ch)+1);
        return word;
    }
};

345. 反转字符串中的元音字母 - 力扣(LeetCode) (leetcode-cn.com)

这道题借用了英雄哥的思想,属实不会了,然后我看完英雄哥的思想后又找了类型题做的

char vowels[] = "aeiouAEIOU";//将所有元音字母打出来以方便判断

bool isVowel(char c) {//用来判断的函数
    int i;
    for(i = 0; vowels[i]!='\0'; ++i) {//这里的for循环大家可能会很陌生,相当于for(int i=0;vowels[i];++i)
        if(vowels[i] == c) {//判断是否是元音字母
            return true;
        }
    }    
    return false;
}

void swap(char *a, char *b) {//交换变量,指针部分
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

char * reverseVowels(char * s){
    int i = 0, j = strlen(s)-1;    
    while(i < j) {
        while(s[i] && !isVowel(s[i]))//如果从前往后判断,不是元音字母则i自增
            ++i;                    
        while(j >= 0 && !isVowel(s[j]))//如果从后往前判断,不是元音字母则自减
            --j;                    
        if(i >= j) break;//如果i>j就没必要自增了,因为你前一部分都没有元音字母,后一部分有也无所谓了,即不能互换           
        swap( &s[i], &s[j] );       
        ++i, --j;//继续往中间靠近直到i=j结束while循环                   
    }
    return s;

}

这段时间较忙,待我有时间一定会找出题的最优解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

forget hurt

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

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

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

打赏作者

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

抵扣说明:

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

余额充值