[剑指offer-58]翻转字符串

[58]翻转字符串

1.翻转单词顺序

1.1题目

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点和普通字母一样处理

输入

“I am a student.”

输出

“student. a am I”

1.2思路

  1. 翻转句子中所有的字符
  2. 翻转每个单词中字符的顺序

1.3代码

1.3.1.C
void Reverse(char* pBegin, char* pEnd)
{
    if(pBegin==NULL || pEnd==NULL) return ;
    while(pBegin < pEnd)
    {
        char temp = *pBegin;
        *pBegin = *pEnd;
        *pEnd = temp;
         
         pBegin++;
         pEnd--;
    }
}

char* reverseWords(char* s) 
{
    if(s == NULL) return NULL;
    
    char *pBegin = s;
    char *pEnd = s;
    
    while(*pEnd != '\0') pEnd++;
    pEnd--;   //找到结尾
    
    Reverse(pBegin, pEnd);
    
    //翻转每一个单词
    pBegin = pEnd = s;
    while(*pBegin != '\0')
    {
        if(*pBegin == ' ') //去掉空格
        {
            pBegin++;
            pEnd++;
        }
        else if(*pEnd == ' ' || *pEnd =='\0')
        {
            Reverse(pBegin, --pEnd);
            pBegin = ++pEnd;  // 指向下一个字符
        }
        else
        {
            pEnd++;
        }
    }
    
    return s;
}
1.3.2.C++
// 两种实现翻转的方式
for(int i=0,j=s.size()-1;i<j;i++,j--) swap(s[i],s[j]);
reverse(s.begin(), s.end());  // 先整体翻转  
class Solution {
public:
   string reverseWords(string s)
   {
        for(int i=0,j=s.size()-1;i<j;i++,j--) swap(s[i],s[j]);
        //reverse(s.begin(), s.end());  // 先整体翻转
        
        for(int i=0;i<s.size();i++)
        {
            int j=i;
            while(j<s.size() && s[j] != ' ') j++;
            reverse(s.begin()+i,s.begin()+j);
            i=j;
        }
        return s;
   }
};

2.左旋转字符串

2.1题目

字符串的左旋转操作是把字符串前面的若干个字符串转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能

输入字符串abcdefg 和数字 2

该函数返回左旋转两位得到的结果cdefgab

2.2思路

暴力解法

  1. 移动第一位,然后把后面字符移动到前面
  2. 调用函数移动多位

2.3代码

class Solution {
public:
    string leftRotateString(string str, int n) 
    {
        while(n--)
          LeftOne(str);
        
        return str;
    }
    
    void LeftOne(string &str)
    {
        char a=str[0];
        for(int i=1;i<str.size();i++)
            str[i-1] = str[i];
        str[str.size()-1] = a;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值