剑指offer 43、44:左旋转字符串、翻转单词顺序列

43.题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路:XY -> YX
(XT YT)T==YX 每个子串反转后,再总体反转。

class Solution {
public:
    string LeftRotateString(string str, int n) {
        if(str.empty())
            return str;
        n=n%str.size();
        for(int i=0,j=n-1;i<j;++i,--j)//X->XT
            swap(str[i],str[j]);
        for(int i=n,j=str.size()-1;i<j;++i,--j)//Y->YT
            swap(str[i],str[j]);
        for(int i=0,j=str.size()-1;i<j;++i,--j)XTYT->YX
            swap(str[i],str[j]);
        return str;
    }
};
# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        if len(s)==0:
            return s
        n=n%len(s)
        return s[n:]+s[:n]
        # write code here
# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        length=len(s)
        if length==0:
            return s
        n=n%length
        s=s[:n][::-1]+s[n:][::-1]
        s=s[::-1]
        return s

44.题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

class Solution {
public:
    void reverse(string &str,int start,int end)
    {
        for(int i=start,j=end;i<j;++i,--j)
            swap(str[i],str[j]);
    }
    string ReverseSentence(string str) {
        if(str.empty())
            return str;
        reverse(str,0,str.size()-1);
        int start=0;
        while(start<str.size())        {
            while(start<str.size() && str[start]==' ')//过滤空格
                ++start;
            int temp=start;
            while(start<str.size() && str[start]!=' ')//获取字符长度
                ++start;
            reverse(str,temp,start-1);
        }
        return str;
    }
};

# -*- coding:utf-8 -*-
class Solution:
    def ReverseSentence(self, s):
        if len(s)==0:
            return s
        s=s[::-1]
        length=len(s)
        start=0
        while start<length:
            while start<length and s[start]==' ':
                start+=1
            temp=start
            while start<length and s[start]!=' ':
                start+=1
            s=s[:temp]+s[temp:start][::-1]+s[start:]
        return s
        # write code here

猜你喜欢

转载自blog.csdn.net/zd_nupt/article/details/81449185