【算法day8】字符串:反转

主播今天脑子不好用,先写两题吧~

题目引用


  1. 反转字符串中的单词
  2. 右旋字符串

1.反转字符串


给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"

输出:"blue is sky the"

示例 2:

输入:s = " hello world "

输出:"world hello"

解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good example"

输出:"example good a"

解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

我们来看一下题目,要求我们将一个英文句子的每个单词都反转且单词内字母顺序为正序。首先我们可以将反转函数写出来反转时使用,因为反转过后末尾的空格可能会占据句首,所以我们要写一个removespace函数出来,使其将所有多余的空格去掉。

怎么去掉呢?又是双指针。这里的步骤其实和昨天的最后一题替换数字挺像的,我们定义一个slow指向修改时字符串的位置,然后进入循环当s[i]!=' '时,判断slow是否为0,如果为0,直接将i位置的数赋值给slows[slow++]=s[i++],如果不为0,说明不是第一个单词了,需要加上一个空格再赋值。

最后就是将两个函数整合起来,先将多余的空格去掉,再将整个字符串reverse,最后按每个单词的区间来反转回正序。

来看代码:

cpp 复制代码
void reverse(string& s,int start,int end){
        for(int i=start,j=end;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }
    void removespace(string& s){
        int slow=0;
        for(int i=0;i<s.size();i++){
            if(s[i]!=' '){
                if(slow!=0) s[slow++]=' ';
                while(i<s.size()&&s[i]!=' ') s[slow++]=s[i++];
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
        removespace(s);
        reverse(s,0,s.size()-1);
        int start=0;
        for(int i=0;i<=s.size();i++){
            if(i==s.size()||s[i]==' '){
                reverse(s,start,i-1);
                start=i+1;
            }
        }
        return s;
    }

2.右转字符串


题目描述

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例

2

abcdefg

输出示例

fgabcde

这题说实话是奖励题,我们按照给的数字确定反转区间,先将整个字符串反转,再将0-nn-end的位置分别反转就行了

直接看代码吧

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int len = s.size(); //获取长度

    reverse(s.begin(), s.end()); // 整体反转
    reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
    reverse(s.begin() + n, s.end()); // 再反转后一段

    cout << s << endl;

} 

总结


今天的题目比较简单,但其实很多细节需要掌握,例如第一题的去除多余空格的那一步...

明天见~

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法