記事ディレクトリ
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大小的空间。