劍指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;
    }
};

 

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