2016-08-15 132 views
0

問題:編寫一個函數,它接受一個字符串作爲輸入並返回字符串反轉。反向字符串(Leetcode)使用C++,爲什麼我不能返回新字符串作爲方法

示例:給定s =「hello」,返回「olleh」。

這段代碼有什麼問題?

class Solution { 
public: 
    string reverseString(string s) { 

     string s2; 

     for(int i=0; i<s.length(); i++) 
      s2[i] = s[s.length()-1-i]; 

     return s2; 
    } 
}; 
+1

使用reverse_copy? – YOU

+0

你是什麼意思「我不能這樣做」?你有什麼跡象表明這是錯誤的? –

+0

是的,這是反向複製,這個代碼有什麼錯? – User6715985

回答

2

您無法訪問訪問權限,您必須在分配結果字符串之前調整結果字符串的大小。

std::string reverseString(const std::string& s) { 
    std::string s2(s.size(), '\0'); 

    for(int i=0; i<s.length(); i++) 
     s2[i] = s[s.length()-1-i]; 

    return s2; 
} 

或者簡單地使用正確的構造函數:

std::string reverseString(const std::string& s) { 
    return {s.rbegin(), s.rend()}; 
} 
+0

這應該是'(s.size(),'\ 0') '(或其他角色,或調用'resize')。 'std :: string'選擇了不帶構造函數的構造函數,因爲'std :: string s ='a';'不會將它初始化爲1個字符(a)。 – chris

+0

@chris:固定,謝謝。 – Jarod42

+0

非常感謝你@chris – User6715985

2

因爲循環的第一次迭代嘗試將s2[0]設置爲原始字符串的最後一個字符。

問題是沒有s2[0]s2字符串是完全空的。本質上,s2字符串是一個空數組。

試圖訪問使用[]操作者的字符串的內容訪問該字符串的現有字符。它不創建一個,如果它不存在。

即使代碼執行仍然存在此未定義的行爲,在循環的下一次迭代中嘗試將s2[1]設置爲某些字符。 s2[1]不存在,超過s2[0]。等等。未定義的行爲。崩潰。

而不是設置不存在的空字符串的值,只需使用push_back()將每個字符添加到s2

當然,這並不是真正有效的反轉字符串內容的方法。但這是第一次嘗試解決這個介紹性任務的好習慣。

+0

Sam,非常感謝我對字符串&數組概念的有限體驗......我知道了 – User6715985

+0

謝謝... @Sam Varshavchik – User6715985

相關問題