【劍指offer】面試題42-翻轉單詞順序VS左旋轉字符串

題目一:

問題描述:

輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。爲簡單起見,標點符號和普通字符一樣處理。比如輸入字符串”I am a student.”輸出字符串”student. a am I”.


問題分析:

這種題目比較簡單,翻轉兩次字符串就可以。第一次翻轉整體字符串,第二次翻轉單個單詞。當然兩次順序可以顛倒~~實現起來比較簡單,主要就是翻轉函數。


代碼實現:

#include<iostream>
using namespace std;
#include<cassert>
void ReverseWord(char* begin, char* end)
{
       assert(begin && end);
       while (begin < end)
       {
              char tmp = *begin;
              *begin = *end;
              *end = tmp;
              begin++; 
              end--;
       }
}
void ReverseSentence(char* str,int len)
{
     assert(str);
     char* start = str;
     char* end = str;
     ReverseWord(start, str + len - 1);
     //
     while (*end != '\0')
     {
            while (*end != ' ' && *end != '\0')
            {
                   ++end;
            }//遇到了空格或者字符串結束了
           ReverseWord(start, end - 1);
           if (*end != '\0')
            {
                   start = end + 1;
                   end = start;
            }
    }
}

int main()
{
       char str[] = "I am a student";
       ReverseSentence(str,sizeof(str)/sizeof(str[0])-1);
       cout << str << endl;
       system("pause");
       return 0;
}

題目二:

問題描述:

字符串的左旋轉操作是把字符串的前邊若干個字符移到字符串的尾部。請定義一個函數實現字符串左旋轉操作的功能。比如輸入字符串“abcdefg”和數字2,則輸出“cdefgab”.


問題分析:

有了上邊一個題目的基礎,這個題目仍然是旋轉,旋轉整體和旋轉部分。就像上個題目一樣,旋轉整個字符串再旋轉每個單詞,這個題目也是旋轉整個字符串,再旋轉需要左移的前n個字符和剩下的後n個字符,仍然可以調用上邊的ReverseWord()函數。


代碼實現:

#include<iostream>
using namespace std;
#include<cassert>
//左旋
void ReverseWord(char* begin, char* end)
{
       assert(begin && end);
       while (begin < end)
       {
              char tmp = *begin;
              *begin = *end;
              *end = tmp;
              begin++;
              end--;
       }
}
void LeftRotate(char* str, int n)
{
       assert(str);
       int len = strlen(str);
       if (n < len && n > 0 && len > 0)
       {
              //先翻轉前n
              ReverseWord(str, str + n - 1);
              //翻轉後邊的字符
              ReverseWord(str + n, str + len - 1);
              //翻轉整體
              ReverseWord(str, str + len - 1);
       }

}
int main()
{
       char str[] = "abcdef";
       LeftRotate(str,2);
       cout << str << endl;
       system("pause");
       return 0;
}

今天的題目就分析到這裏了~最後還是想祝大家新年快樂~希望自己在新的一年裏放下不屬於自己的人或事~成爲更好的自己~~

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