leetcode-1417. 重新格式化字符串刷題筆記(c++)

寫在前面

  • 難度:簡單
  • 數字、字符重新組合
  • 知識點
    • string 類length()size()函數返回類型爲無符號數
    • unsigned int 類型,做減法時不需類型轉換;但當值小於0時會溢出,成爲1個無效的數字

題目詳情

給你一個混合了數字和字母的字符串 s,其中的字母均爲小寫英文字母。

請你將該字符串重新格式化,使得任意兩個相鄰字符的類型都不同。也就是說,字母后面應該跟着數字,而數字後面應該跟着字母。

請你返回 重新格式化後 的字符串;如果無法按要求重新格式化,則返回一個 空字符串 。

示例 1:

	輸入:s = "a0b1c2"
	輸出:"0a1b2c"
	解釋:"0a1b2c" 中任意兩個相鄰字符的類型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是滿足題目要求的答案。
示例 2:

	輸入:s = "leetcode"
	輸出:""
	解釋:"leetcode" 中只有字母,所以無法滿足重新格式化的條件。
示例 3:

	輸入:s = "1229857369"
	輸出:""
	解釋:"1229857369" 中只有數字,所以無法滿足重新格式化的條件。
示例 4:

	輸入:s = "covid2019"
	輸出:"c2o0v1i9d"
示例 5:

	輸入:s = "ab123"
	輸出:"1a2b3"

提示:

1 <= s.length <= 500
s 僅由小寫英文字母和/或數字組成。

ac代碼

  • 解題思想
    • 數字vector、字符vector
    • 根據不同長度,循環拼接
class Solution
{
public:
    string reformat(string s)
    {
        vector<char> n,c;
        string ans;
        for(int i=0; i<s.length(); i++)
        {
            if(s[i]>='0' && s[i]<='9')
                n.push_back(s[i]);
            else
                c.push_back(s[i]);
        }

        // size()返回值類型 unsigned int, 減法爲負數 溢出
        int ns = n.size(), cs = c.size();
        if ((cs - ns > 1) || (ns - cs > 1))
            return "";

        if(ns >= cs)
        {
            for(int i=0; i<cs; i++)
            {
                ans += n[i];
                ans += c[i];
            }
            if (ns > cs)
                ans += n[ns-1];
        }
        else
        {
            for(int i=0; i<ns; i++)
            {
                ans += c[i];
                ans += n[i];
            }
            ans += c[cs-1];
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章