DAY8 反转字符串 反转字符串II 替换数字 翻转字符串里的单词 右旋字符串

344反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

没啥好说的,双指针秒了。

class Solution {
public:
    void reverseString(vector<char>& s) {
         int left=0,right=s.size()-1;
         while(left<right)
         {
            swap(s[left],s[right]);
            left++;
            right--;
         }
    }
};

541反转字符串II

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

也是双指针,和前面那个类似,只是判断条件繁琐一点。

手搓↓

class Solution {
public:
    string reverseStr(string s, int k) {
           int n=s.size()/(2*k);
           int a=0;
           int b=s.size()%(2*k);
           while(n--)
           { int left=a,right=a+k-1;
             while(left<right)
             {swap(s[left],s[right]);
              left++;right--;
             }
             a+=2*k;
           }
           if(b==0)return s;
           else if(b<k)
           {
               int left=a,right=s.size()-1;
                while(left<right)
             {swap(s[left],s[right]);
              left++;right--;
             }
           }
           else
           {   int left=a,right=a+k-1;
                while(left<right)
             {swap(s[left],s[right]);
              left++;right--;
             }

           }

           return s;
    }
    
};

简化版本↓

class Solution {
public:
    string reverseStr(string s, int k) {
          for(int i=0;i<s.size();i=i+2*k)
          {
              if(i+k<=s.size())
              {
                int left=i,right=i+k-1;
                while(left<right)
             {  swap(s[left],s[right]);
                left++;right--;
             }
              continue;}
               int left=i,right=s.size()-1;
                while(left<right)
             {  swap(s[left],s[right]);
                left++;right--;
             }
          }
           return s;
    }
    
};

替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

对于输入字符串 "a5b",函数应该将其转换为 "anumberb"

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

样例输入:a1b2c3

样例输出:anumberbnumbercnumber

数据范围:1 <= s.length < 10000。

折磨人的开始了,这个如果在原字符串的基础上做的话,需要扩容,然后双指针

首先扩充数组到每个数字字符替换成 "number" 之后的大小。

例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。

如图:

 

然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

 投机取巧通过法:

#include <cstdio>
#include <iostream>
#include <string.h>
 
using namespace std;
 
int main()
{
    string s;
    cin >> s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        cout << "number";
        else
        cout<< s[i];
    }
}

正常不开辟空间做法:

#include <cstdio>
#include <iostream>
#include <string.h>
#include<string>
using namespace std;
 
int main()
{
    string s;
    cin >> s;
    int count=0;
    int Oldsize=s.size();
    for(auto i=0;i<s.size();i++)
    {
        if(s[i]>='0'&&s[i]<='9')
        count++;
    }
    s.resize(s.size()+5*count);
    int Newsize=s.size();
    for(int left=Oldsize-1,right=Newsize-1;left<right;left--,right--)
    {
      
        if(s[left]>='a'&&s[left]<='z')
        {
            s[right]=s[left];
        }
        else
        {
            s[right]='r';
            s[right-1]='e';
            s[right-2]='b';
            s[right-3]='m';
            s[right-4]='u';
            s[right-5]='n';
            right=right-5;
        }
 
   
    }
       cout << s;
}

151翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

究极折磨人,大概思路是先去掉多余的空格,然后整体反转+局部反转

解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转
class Solution {
public:
    string reverseWords(string s) {
       int slow=0;
       for(int fast=0;fast<s.size();fast++)
       {
          if(s[fast]!=' ')
         {  if(slow!=0)
           {
               s[slow]=' ';
               slow++;
           }
           while(fast<s.size()&&s[fast]!=' ')
           {
               s[slow]=s[fast];
               slow++;
               fast++;
           }
         }      
       }   
        s.resize(slow);
        int left=0,right=s.size()-1;
        reverse(s.begin(),s.end());//翻转
       int slow1=0,fast1=0;
       while(fast1<s.size())
       {
           if(fast1<s.size()-1&&s[fast1+1]==' ')
           {
               reverse(s.begin()+slow1,s.begin()+fast1+1);
               slow1=fast1+2;
           }
           else if(fast1==s.size()-1)
           reverse(s.begin()+slow1,s.begin()+fast1+1);
           fast1++;
       }
        return s;
    }
};

 右旋字符串

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

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

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

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

有了上一题的思路,这题easy

先整体翻转,之后再分别对前k个和后s.size()-k个翻转就行

#include<iostream>
#include<string>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
    int k;
    string s;
    cin >> k >>s;
    reverse(s.begin(),s.end());
    reverse(s.begin(),s.begin()+k);
    reverse(s.begin()+k,s.end());
   
    cout << s;
}

结束!

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值