参考記事
LeetCodeの試験から - 文字列を整数に、この記事では主に、参照LeetCode上の問題への公式なソリューションです
有限オートマトンのコンパイラ理論の概念を使用して問題への公式ソリューションは、知識のコンパイラの理論はその解決のバージョンを記録し、この記事のScalaで、アルゴリズムに適用することができ期待していなかった、ではなく、レポートに解釈し、特定の質問、詳細な説明を見たいですまた、会場の公式サイトのバックルを強制してください
https://leetcode-cn.com/problems/string-to-integer-atoi/
問題の整数の文字列を変換します
まず、空白文字で始まります関数は、これまでの最初の非空白文字を見つけるまで、必要であれば無用捨てます。次のように次の変換ルールは以下のとおりです。
- 多くの連続した数字は、符号付き整数を形成するために結合されるように、第1の文字が非ヌル正または負の数で逆の符号である場合
- 最初の非空白文字は、整数を形成する数字を連続的に組み合わせた直後である数、であれば、
- 文字列は、有効な整数部の後に余分な文字があるかもしれない、これらの文字は無視することができ、彼らはの機能に影響はありません
注意:
最初の非空白文字が有効な整数の文字列でない文字列が空であるかだけ空白文字列が含まれている場合、この関数は変換が効果的でないことを変換する必要はありません。機能が効果的に変換できない場合はいずれの場合にも、0を返します
ヒント:
タイトルのみ空白スペース文字を含む「は、」
我々は、32ビットの環境を記憶することができることが想定されるその後の値の範囲の整数を符号付きサイズ[ - 231 231 - 1]。値がこの範囲を超えた場合、INT_MAXを返す(231 - 1)又はINT_MIN(- 231)
例1:
入力:「42
出力:42
例2:
入力:「-42」
出力:-4
説明:最初の非空白文字がある「 - 」、それは負の符号で、負の数と、すべての数字として、私たちはコンバインの後ろの行に表示され、最終的に取得します-42
例3:
入力:「4193の言葉で、」
出力:4193
説明:その次の文字としてデジタルOFF「3」の変換は、デジタルではありません
例4:
入力:「言葉と987」
出力:0
説明:有効な「W」最初の非空白文字があるが、それは変換を実行することはできませんので、正の数または負の数ではなく、
実施例5:
入力: "-91283472332
出力:-2147483648
説明:番号" -91283472332「32以上の符号付き整数の範囲、リターンのINT_MINを(- 231)
DFAの決定性有限オートマトンは、五行
即ちペンタッド= A(K、[シグマ、[デルタ]、Q 0、Z)
Kの有限集合、[入力記号のシグマ有限集合、遷移関数δ:;開始状態Q 0 ;最終状態の集合Z
伝達関数δ:K×Σ→K、例外:δ(Q、ε)= Q
ここでは借入の公式ウェブサイト上の遷移図の概念を説明するために、それ
有限集合K = {開始、署名され、in_number、端}
入力シンボルの有限集合Σ= {数、+、 - 、 ︺、他方は}
ここで、「数が」9〜10の数字0を指し、「その他」は、数値に加えて、他のすべての文字、正符号およびスペースを指し
伝達関数δ(開始、+)=δ(開始は、 - )署名さ=δ(符号付き、数)=番号他の伝達関数は、過度の例ではありません
スタート状態Q 0 =スタート
最終状態の集合Z = {終了}
公式サイトも提供して遷移表の表現を
入力シンボルは、NFAオートマトン非決定性有限で、状態の他の複数の状態に対応することができる場合
DFAソリューション
デフmyAtoi (STR:文字列):のInt = {
/ *
*构造转移表
* /
VARのマップ= 新しい可変。HashMapの[ 文字列、リスト[ 文字列]()
地図+ = ("スタート" - > リスト("スタート" 、"署名された" 、"in_number" 、"終了" ))
地図+ = ("符号付き" - > リスト("、"終了" 、"in_number" 、"終了" ))
地図+ = ("in_number" - > リスト("終了" 、"終了" 、"in_number" 、"終了" ))
マップは+ = ("終了" - > 一覧(「終了」、「終了」、「終了」、「終了」))
/ *
*の遷移テーブルコーディネートDXとのDy
*Start状態をスタート
* /
VARDX="スタート"
VAR のDy = 0
/ *
*記録負
* /
VARのログイン = 1。
/ *
*保存結果
* /
VAR ANS = 0
のために(CHAR < - STR IF DX != "終了" ){
のDy = IF (CHAR 。isWhitespace )0
他IF (チャー== '+' || チャー== ' - ' )。1
そうであれば(CHAR 。isDigit )2
他の3
DX = マップ(DX )(DY )
であれば(DX == "in_number" ){
/ *
*判断是否超出のInt范围
* /
場合((中間MaxValueを-文字+「0 ')/10<ANS)
戻った場合(符号==1)のInt。MaxValueを他のInt。MinValueプロパティ
他
ANS = ANS * 10 + CHAR - '0'
} そうであれば(DX == "符号付き" ){
記号= 場合(charが== '+' )1 そう- 1
}
}
ANS * 記号を
}