コードに関するランダムな考え - 文字列|● 344. 文字列を反転する 541. 文字列を反転する II オファーするポイント 05. スペースを置換する 151. 文字列内の単語を反転するオファーするポイント 58-II. 文字列を左に回転する

カタログ概要

1. 文字列を反転します

タイトル説明:

入出力例:

考えやアイデア:

次に、文字列 2 を反転します。

タイトル説明:

入出力例:

考えやアイデア:

3. スペースを置換する

タイトル説明:

入出力例:

考えやアイデア:

4. 文字列内の単語を反転します。 

タイトル説明:

入出力例:

考えやアイデア:

5. 文字列を左に回転させます

タイトル説明:

入出力例:

考えやアイデア:


1. 文字列を反転します

タイトル説明:

入力文字列を反転する関数を作成します。入力文字列は s 文字配列として与えられます。

別の配列に余分なスペースを割り当てないでください。この問題を解決するには、O(1) の余分なスペースを使用して、入力配列をインプレースで変更する必要があります。

入出力例:

示例1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例2:
输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

ヒント:

  • 1 <= s.length <= 105
  • s[i]すべてはASCIIコード表 の印刷可能な文字 です 

考えやアイデア:

        同じ文字列内の 2 つの要素を交換するには、キャッシュに必要な文字変数は 1 つだけです。

class Solution {
public:
    void reverseString(vector<char>& s) {
        char tmp;
        for(int i = 0, j = s.size() - 1; i < j; i++, j--){
            tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
        }
    }
};

次に、文字列 2 を反転します。

タイトル説明:

文字列 s と整数 を指定するとk、文字列の先頭から数えてすべての文字について 2k 、 2k 文字列内の前の文字が 反転されますk 。

  • 残りの文字が 未満の場合は k 、残りの文字をすべて反転します。
  • 残りの文字が 文字2k 以上で ある場合はk 、前の k 文字を反転し、残りの文字をそのまま残します。

入出力例:

示例1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例2:
输入:s = "abcd", k = 2
输出:"bacd"

ヒント:

  • 1 <= s.length <= 104
  • s 小文字の英語のみで構成されています
  • 1 <= k <= 104

考えやアイデア:

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += (2 * k)) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= s.size()) {
                reverse(s.begin() + i, s.begin() + i + k );
            } else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }    
};

3. スペースを置換する

タイトル説明:

s 文字列内の各スペースを「%20」に置き換える関数を実装してください 。

入出力例:

示例1:
输入:s = "We are happy."
输出:"We%20are%20happy."

制限:

0 <= s 的长度 <= 10000

考えやアイデア:

ステップ 1: スペースの数を数える

ステップ 2: 文字列を展開する

ステップ 3: 文字列を置き換える

class Solution {
public:
    string replaceSpace(string s) {
    //步骤一,统计空格数量
    int count = 0;
    int size = s.size();
    for(int i = 0; i < s.size(); i++){
        if(s[i] == ' '){
            count++;
        }
    }

    //步骤二:进行扩容
    s.resize(s.size() + count * 2);
    int newSize = s.size();

    //步骤三:进行字符串替换
    for(int i = size - 1, j = newSize - 1; i < j; i--, j--){
        if(s[i] != ' '){
            s[j] = s[i];
        }
        else{
            s[j] = '0';
            s[j - 1] = '2';
            s[j - 2] = '%';
            j -= 2;
        }
    }
    return s;      
    }
};

4. 文字列内の単語を反転します。 

タイトル説明:

文字列を指定すると s 、 文字列内の単語の順序が逆になります 。

単語は 空白以外の文字の文字列です。文字列内の単語はs 少なくとも 1 つのスペースで  区切ります。

単語を 反転し、 単語を 1 つのスペースで結合した結果の文字列を返します 。

注:入力文字列の s単語間には、先頭のスペース、末尾のスペース、または複数のスペースが存在する場合があります。返される結果文字列では、単語は 1 つのスペースでのみ区切られ、余分なスペースは含まれないようにしてください。

入出力例:

示例1:
输入:s = "the sky is blue"
输出:"blue is sky the"

示例2:
输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例3:
输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

ヒント:

  • 1 <= s.length <= 104
  • s 英語の大文字と小文字、数字、スペースが含まれています ' '
  • s 少なくとも 1 つの単語が 存在 します

考えやアイデア:

  • ステップ 1: 空のスペースを削除する
  • ステップ 2: 文字列全体を反転する
  • ステップ 3: 各単語を反転する
class Solution {
public:
    void deleteSpace(string& s){
        int slow = 0;
        for(int fast = 0; fast < s.size();++fast){
            if(s[fast] != ' '){
                if(slow != 0){
                    s[slow++] = ' ';
                }
                while (fast < s.size() && s[fast] != ' ') { 
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
    }
    void reverse1(string& s, int start, int end){ //翻转,区间写法:左闭又闭 []
        for (int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
    string reverseWords(string s) {
        //步骤一,去除多余的空格
        deleteSpace(s);
        //步骤二,整个字符串进行翻转
        reverse(s.begin(), s.end());
        //步骤三,进行单词翻转
        int start = 0; 
        for (int i = 0; i <= s.size(); ++i) {
            if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。
                reverse1(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。
                start = i + 1; //更新下一个单词的开始下标start
            }
        }        
        return s;
    }
};

5. 文字列を左に回転させます

タイトル説明:

文字列の左回転操作は、文字列の前のいくつかの文字を文字列の末尾に転送することです。文字列の左回転操作の機能を実現する関数を定義してください。たとえば、文字列「abcdefg」と数値 2 を入力すると、関数は 2 ビット左回転した結果「cdefgab」を返します。

入出力例:

示例1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

制限:

  • 1 <= k < s.length <= 10000

考えやアイデア:

  • ステップ 1: 区間内の最初の n の部分文字列を反転します。
  • ステップ 2: 区間 n から最後までの部分文字列を反転します。
  • ステップ 3: 部分文字列全体を反転する
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        //步骤一:反转区间前n的子串
        reverse(s.begin(), s.begin() + n);
        //步骤二:反转区间n到末尾的子串
        reverse(s.begin() + n, s.end());
        //步骤三:反转整个字符串
        reverse(s.begin(), s.end());
        return s;
    }
};

おすすめ

転載: blog.csdn.net/weixin_42373086/article/details/130552740
おすすめ