今日は、文字列関連のアルゴリズムインタビューの質問をあなたと共有します。大きな工場に入ると、アルゴリズムの面接の質問がありますが、アルゴリズムとデータ構造には特定のしきい値があるため、このしきい値を超えてゆっくりと蓄積し、何度も何度も確認することは実行可能な戦略です。
この質問は、Leetcodeの151番目の質問です。文字列内の単語を逆にします。
この問題を解決するアイデア:
-
文字列内の無駄なスペースをクリアし、【「
are you ok
」を「are you ok”
】に整理する -
次に、処理された文字列を逆にして、[「areyouok」を「kouoyera」に整理します]
-
各単語を個別に反転し、[koをokに、uoyをあなたに、eraをareに変更します]
-
最終結果は「OKyouare」です 。
1.スペースを空ける
2.弦全体が逆になります
3.次に各単語を反転します
目標1.文字列内の無駄なスペースを排除する swift 输入:s = " are you ok "
输出:"are you ok"
要件:役に立たないスペースには、最初、中間、および最後の位置のスペースが含まれます
アイデア:
1.文字列配列をトラバースし、そうでない 場合" "
は配列に追加します
2.そうである場合は" "
、空であるかどうかを判断し、空である場合はスキップし、そうでない場合" "
は配列に追加します。[2つの単語の間に複数のスペースがある場合がありますが、処理後は1つのスペースしか表示できないため、前にそれも空であるかどうかを判断する必要があります ]
func clearSpace(str: String) -> [Character] {
var chars = [Character]()
var space = true
for c in str {
if c != " " {
chars += "\(c)"
space = false
} else if space == false {
chars += " "
space = true
}
}
return chars
}
コード内のスペース の機能は、[アイデア2]の判断ロジックを実現することです。使用するだけです
s = " are you ok "
例としてコードを見てみましょう。
-
開始は
" "
ですので、何もせず、「a」に移動するまで実行を続けます -
c = aであるため、chars配列に追加され、スペースはfalseとしてマークされます(このマークの意味は次のとおりです。rに移動すると、最後のスペースは最後のスペースではないことがわかります。スペースの値= false)。'e'へのトラバーサルまで実行を続行します
-
次に、c =
" "
ですが、スペース= falseであるため、chars + =の" "
場合、スペースはtrueとしてマークされます。実行を続行します。この時点で、c =" "
、コードによると、操作は実行されません。c = yになるまで実行を続け、最初のステップに戻ります。
ここでより重要な点は、スペースの 初期値が真であるということです。
以下は、javaの実装コードです。
public String clearSpace(String s) {
if (s == null) return "";
char[] chars = s.toCharArray();
boolean space = true;
for (int i = 0; i < chars.length; i++) {
if (chars[i] != ' ') { // chars[i]是非空格字符
chars[cur++] = chars[i];
space = false;
} else if (space == false) { // chars[i]是空格字符,chars[i - 1]是非空格字符
chars[cur++] = ' ';
space = true;
}
}
}
目標2.フリップ
これは非常に簡単で、コードは次のとおりです。
func reverseString(_ chars: inout [Character], _ l: inout Int, _ r: inout Int) {
r -= 1
while l < r {
let c = chars[l]
chars[l] = chars[r]
chars[r] = c
l += 1
}
}
このコードの意味は、["are youok"を "ko uoyera"に整理することです]
全体的な実現:
class Solution {
func reverseWords(_ s: String) -> String {
var chars = [Character]()
var space = true
for c in s {
if c != " " {
chars += "\(c)"
space = false
} else if space == false {
chars += " "
space = true
}
}
if space == true {
chars.removeLast()
}
let count = chars.count
reverseString(&chars, 0, count)
var preIdx = -1
for i in 0..<count {
if chars[i] == " " {
reverseString(&chars, preIdx+1, i)
preIdx = i
}
}
reverseString(&chars, preIdx+1, count)
var str = ""
for c in chars {
str += "\(c)"
}
return str
}
func reverseString(_ chars: inout [Character], _ l: Int, _ r: Int) {
var b = l
var e = r - 1
while b < e {
let c = chars[b]
chars[b] = chars[e]
chars[e] = c
b += 1
e -= 1
}
}
}
総括する:
私が今日学んだ問題解決のアイデアは、アルゴリズムの問題をサブ問題に分解し、サブ問題を処理した後に組み立てることで、問題を解決できるというものです。面接に合格したい場合でも、質問をして、いくつかの問題の解決策を蓄積する必要があります。さて、私はあなた方全員を助けることを望んで、今日あなた方と多くを共有します。
[The Way of Infinite Testing]パブリックアカウントへの注目、[リソースの受信]への返信、
Pythonプログラミング学習リソースの乾物、
Python + AppiumフレームワークAPPUI自動化、
Python + Seleniumフレームワーク
WebUI自動化、Python + UnittestフレームワークAPIへようこそオートメーション、
リソースとコードは無料で送信されます〜
記事の下部に公式アカウントのQRコードがあります。WeChatでスキャンしてフォローするだけです。
備考:私の個人公開アカウントが正式に開設され、ビッグデータテスト、機能テスト、テスト開発、APIインターフェイスの自動化、テストの運用と保守、UI自動化テストなどのテストテクノロジーの共有に専念しています。WeChat検索パブリックアカウント:「WuliangThe Way of Testing」、または以下のQRコードをスキャンしてください。
注意を向けて、一緒に成長しましょう!