《劍指offer》——左移字符串

題目:把字符串前面n個字符串轉移到字符串的尾部。如“abcdefg”左移2位後變爲“cdefgab”。

思路:以“abcdefg”左移2位後變爲“cdefgab”爲例,可以先把字符串分爲兩部分,前面2個字符”ab”爲一部分,內部進行反轉,得到”ba”;再把剩餘部分字符進行反轉,得到”gfedc”;最終將整個字符串進行反轉,得到”cdefgab”。

代碼如下,

/*字符串反轉*/
string ReverseString(string &str, int begin, int end)
{
    char temp;//臨時輔助變量
    while(begin < end)//從兩端向中間成對反轉字符
    {
        temp = str[begin];
        str[begin] = str[end];
        str[end] = temp;
        begin++, end--;
    }
    return str;
}

/*左移字符串*/
string LeftRotateString(string str, int n) 
{
    string result;
    if(str.size() == 0 || n < 0)//若輸人空串或左移小於0位,則返回空串
        return result;
    if(n % str.size() == 0 || n == 0)//若左移位數是字符串長度的整數倍或左移0位,則返回原字符串
        return str;
    result = ReverseString(str, 0, n - 1);//反轉前半部分字符串
    result = ReverseString(str, n, str.size() - 1);//反轉後半部分字符串
    result = ReverseString(str, 0, str.size() - 1);//反轉整個字符串
    return result;
}

擴展:字符串內單詞順序反轉,單詞不反轉。如,將“I am a student.”變成“student. a am I”。

思路:以將“I am a student.”變成“student. a am I”爲例,可以想到先把整個字符串反轉,得到”.tneduts a ma I”,然後再將單詞內部反轉,即可得到“student. a am I”。其中,將”.”作字母處理。

代碼如下,

/*字符串反轉*/
string ReverseString(string &str, int begin, int end)
{
    char temp;//臨時輔助變量
    while(begin < end)//從兩端向中間成對反轉字符
    {
        temp = str[begin];
        str[begin] = str[end];
        str[end] = temp;
        begin++, end--;
    }
    return str;
}

/*英文語句反轉*/
string ReverseSentence(string str) 
{
    string result;
    if(str.size() == 0)//若輸人空串,則返回空串
        return result;
    result = ReverseString(str, 0, str.size() - 1);//將整個語句反轉
    int i = 0, j = 0;//設置單詞反轉的始末標誌位,i爲開始位置,j爲結束位置
    while(j < str.size())
    {
        while(str[i] == ' ' && i < str.size())//若反轉後字符串開始位置爲空格,則跳過空格部分
            i++;
        j = i;//語句中某個單詞開始的位置
        while(str[j] != ' ' && j < str.size())//語句中某個單詞結束的位置
            j++;
        result = ReverseString(str, i, j - 1);//單詞內部反轉
        i = j + 1;//語句中下一個單詞開始的位置
    }
    return result;
}
發佈了82 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章