【毎日のスクラッチアルゴリズム問題(8)】最後の単語の長さ|文字列を並べ替える


1. 最後の単語の長さ

直接クリックしてください~

ここに画像の説明を挿入

アイデア 1: 後ろから前へトラバースする

  • 後ろから前にトラバースし、最初に最後の文字を見つけてから、スペースが見つかるまで前方にトラバースし続けます。長さを返すだけです。
  • 詳細は以下のとおりです。
  • 奥から前へ横断するスペースの場合は飛ばしてください。
  • そうでない場合は、最後の文字から直接カウントを開始します。計算後、スペースまたは文字列の開始位置、つまり下付き文字 0 の位置が必ず見つかります。長さを返すだけです。

具体的なコードは次のとおりです。

class Solution {
    
    
public:
//思路:从后往前遍历,先找到最后一个字母,然后继续往前遍历,直到遇到空格,返回长度即可。
    int lengthOfLastWord(string s) 
    {
    
    
        //情况1:
        //如果从后开始是空格,那就跳过
        int end = s.size() -1;
        while(s[end]==' ')
            --end;
        
        //此时遇到了最后一个单词的最后一个字母
        int len = 0;
        while(end>=0 && s[end]!=' ')
        {
    
    
            ++len;
            --end;
        }
        return len;
    }
};

时间复杂度O(n),空间复杂度O(1)

アイデア 2:

このアイデアを見てください。推奨されません。

  • 大まかな状況は同じですが、違いがあります。
  • 2 つの単語の間にはスペースが必要であることがわかっているので、次のようにすることができます。
  • 後ろから前にたどって、最初のi位置が文字で、最初のi-1位置がスペースの場合、iその位置は最後の単語の最初の文字であることを意味します。この時点で停止してください。
  • ただし、次のような状況では無力です。
  • 単語が 1 つだけで他にスペースがない場合は、文字列の先頭に率先してスペースを追加します。
  • スペースを追加する前に、文字列全体を 1 ビット後ろに移動する必要があります。
  • たとえばHello、 は次のようになります。 Hello

それでおしまい。

具体的なコードは次のとおりです。

class Solution {
    
    
public:

    int lengthOfLastWord(string s) 
    {
    
    
        int len = 0;
        int flag = 0;

        //手动在后面开一个空间,再向后挪动数据。
        //然后在0位置处加一个'\0'
        s.push_back(' ');
        for(int i = s.size()-1;i>0;--i)
        {
    
    
            s[i] = s[i-1];
        }
        s[0] = ' ';
        for(int i = s.size()-1;i>=0;--i)
        {
    
    
            //如果一开始就是空格,跳过即可,直到遇到字母。
            //计算完最后一个单词的长度后,后面肯定是空格
            if(isalpha(s[i]))
            {
    
    
                ++len;
                if(s[i-1] == ' ')
                    break;
            }
        }
        return len;
    }
};

时间复杂度O(n),空间复杂度O(1)

2. 文字列を並べ替える

直接クリックしてください~

ここに画像の説明を挿入

一連の考え

  • あらゆるデータセットに対して、

45670213
コードリート

  • 私たちがしなければならないことは次のとおりです。
  • 新しい文字列の下付き文字 4 の位置に、下付き文字 4 に対応する文字 c を置きます。

完了した。

プロセスは次のとおりです。
ここに画像の説明を挿入

具体的なコードは次のとおりです。

//思路,顺序表(indices)中的第i个元素是多少,就放到对应的ret的ret[indices[i]]的位置上,这个位置就放s[i]
//比如s[0]的字符c,对应的indices[0] = 4,那就将字符'c'放入到ret的第4个下标位置。
//时间复杂度O(N),空间复杂度O(N)
    string restoreString(string s, vector<int>& indices) 
    {
    
    
        //首次开辟s.size()大小的空间,初始化成任何字符均可。
        string ret(s.size(),'a');
        for(int j =0; j < s.size(); ++j)
        {
    
    
            ret[indices[j]] = s[j];
        }
        return ret;
    }
};

知らせ:

文字列 ret(s.size(),'a'); ここでは
、s.size() のスペースを指定して文字列クラス ret を初期化します
ここに画像の説明を挿入
具体的なオーバーロードは上記のとおりで、次の文字は何に関係なく初期化できます。

时间复杂度:O(n),遍历字符串的长度个字符,空间复杂度O(n),需要新开辟n大小的空间。

おすすめ

転載: blog.csdn.net/w2915w/article/details/131255030