剑指offer面试题42:翻转单词顺序VS左旋转字符串

一、题目描述

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

二、分析

1.先写一个反转函数,功能是可以反转所有传入的字符串
2.整体反转整个字符串,此时就需要将每个单词的字母顺序翻转,所以遍历此时的字符串
3.遇到空格就记录一个单词的起始位置或截止位置,然后将单词传入反转函数,时期

引用传参、swap函数:

class Solution {
public:
    void reverseworld(string &str,int i,int j)
    {//i和j分别是翻转部分字符串的起止位置
        while(i < j)
        {
            swap(str[i++],str[j--]);
        }
    }
    string ReverseSentence(string str) {
        int len = str.size();
        reverseworld(str,0,len-1);
        int i = 0;//i是单词开始位置
        int j = 0;//j是单词终止为止
        int k = 0;//用来做遍历字符串的变量
        while(k < len)
        {
             while(k<len && str[k] == ' ' )//记录空格的位置
             {
                 k++;
             }
            i = k;//记录开始位置,str[i]是空格
            while( k<len && str[k] != ' ')
            {
                k++;
            }
            j = k;//str[j]此时是空格,所以再反转的时候,应该截止到它前一个翻转
            reverseworld(str,i,j-1);
            
        }
        return str;
    }
};

指针传参、利用指针的交换函数:

 

 

 

左旋转字符串题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

分析:

方法一:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        string s;
        int j = 0;
        for(int i=n ;i<str.length();i++)
        {
            s[j]=str[i];
            j++;
        }
        for(int i = 0; i<=n-1; i++)
        {
            s[j] = str[i];
            j++;
        }
        return s;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章