Lincode刷題No.8


8.Rotate String

lintcode

題解1:

class Solution {
public:
    /**
     * @param str: An array of char
     * @param offset: An integer
     * @return: nothing
     */
    void rotateString(string &str, int offset) {
    	string t_str;
    	int len = str.length();
    	if (len == 0 || offset == 0)return;
    	int new_offset = offset % len;
    
    	int j = len - 1;
    	for (int i = 0; i< new_offset; i++)
    	{
    		t_str.insert(0,1 ,str[j]);
    		j--;
    	}
    
    	if (new_offset == 0)new_offset = len;
    	for (int i=0;i!=j+1;i++)
    	{
    		t_str.push_back(str[i]);
    	}
    
    	for (int i = 0; i < len; i++)
    	{
    		str[i] = t_str[i];
    	}
    }
};

沒能想出空間復雜度O(1)的題解

所以就直接暴力解了,復雜度勉強能接受

反思:

  • 一開始沒看清題目就直接編程,以為offset表示的是字符串的從0開始的下標,其實不然,實際題目的要求是把 offset%len 個末尾字符移動到前面. 就這一點卡了很久,所以正確理解題目很關鍵,不要急於碼代碼.
  • 當 offset > len 時,可以通過 offset%len處理一下,避免重復的循環

題解2

class Solution {
public:
    /**
     * @param str: An array of char
     * @param offset: An integer
     * @return: nothing
     */
    void rotateStr(string &str,int left,int right)
    {
    	while (left < right)
    	{
    		char  tc = str[left];
    		str[left] = str[right];
    		str[right] = tc;
    		left++;
    		right--;
    	}
    }
    void rotateString(string &str, int offset) {
        int len = str.length();
        if(len == 0)return;
    	int new_offset = offset % len;
    	rotateStr(str, 0, len-new_offset-1);
    	rotateStr(str, len-new_offset, len-1);
    	rotateStr(str, 0, len-1);
    }
};

反思

  • 第二次刷仍然犯了第一次的錯誤,實際題目的要求是把 offset%len 個末尾字符移動到前面
  • 實現原理是1 翻轉左邊 2 翻轉右邊 3 翻轉整個字符串

處理時間稍微優化了下,實現了O(1)的空間復雜度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM