タイトル説明
文字列を整数に変換、文字列が有効な戻り値は0されないが、ライブラリの関数を使用することはできません要求は整数文字列に変換します。
イウパット:
+2147483647
1a33
出力:
2147483647
0
アイデア解析
サイン、他のビット数、0が返される文字であるか否かを判断する-単純なコード・ロジックは、ビット0 +のか否かを判断します。
エッジ決意と入力データの主な問題は、決定されます。特定のオーバーフローの判定で。
- 有効。入力文字列を検出することは有効です。ルーチンのテスト。
- ログインしてください。正+番号の文字列入力は、また、純粋にデジタルであってもよいです。決意の数 - 最後に復帰する必要があります。
- オーバーフロー。出力境界int型の数を決定します。主に範囲外最小の負の決定された値とオーバーフローに対処します。
最小の負
INT境界-2147483648-2147483647、最小絶対値が正よりも小さい負の数の絶対値の最大値を入力します。従来の方法では、我々は正の数を使用する結果を示し、最後のステップは、既知の陰性の結果に応じて撮影されますので、最終結果は間違っているであろう。
ソリューション
+、 -スイッチint型、符号が+で、フラグが1であるシンボル-フラグがある場合に-1。プロセスは、符号ビットを計算に関与します。
EG。値=値10 +桁==ための>値値= isNegtive用10 + *桁
バリュークロスボーダー
すなわち、以下-2147483648より、値範囲2147483647より大きい。
ソリューション
各サイクルにおいて、値INT_MAX / 10があるか否か範囲外事前に決定します。
例えば。
- 値> INT_MAX / 10は、拡大するときの10倍の値が境界をし、説明しました。
- 場合複数;> 7場合は、桁の正の範囲:値== INT_MAX / 10は、値の範囲は、または範囲外であってもなくてもよく、使用する現在の必要性はさらに加数桁を決定し、10倍記載拡大場合範囲外の数字> 8、。
- 場合値<INT_MAX / 10、円形ループが範囲外ではないであろう。
合わせた正および負のクロスボーダーの数を決定します
IsNegative負フラグを設定、変数値と現在のレコード過大評価INT_MAX / 10との間の差、INT_MAX / 10 isNegativeがプラスに転じで電流値が、負である場合、陽性であるとして。
過大評価= isNegative *値- INT_MAX / 10
次いで過大評価> 0、境界、過大評価<0、無国境を越え、過大評価== 0、isNegative = 1、桁> 7つの境界; isNegative = -1、数字> 8つの境界。
操作の便宜のために、1,1 0,1に変換される:(isNegative + 1)/ 2 +数字> 8 、範囲外の値。
要約すると、
overValue = isNegative*value - INT_MAX/10
+ (((isNegative+1)/2 + digit > 8) ? 1:0);
場合は過大評価> 0は、値が範囲外、それ以外はありません。
コードの実装
public static int StrToInt(String str) {
int length = str.length();
int isNegative = 1, overValue = 0;
int digit = 0, value = 0;
if (length == 0) {
return 0;
}
char[] chars = str.toCharArray();
int index = 0;
if (chars[0] == '-') {
isNegative = -1;
index = 1;
} else if (chars[0] == '+') {
index = 1;
} else {
index = 0;
}
while (index < length) {
digit = chars[index] - '0';
//overValue用于判断此轮循环是否过界,>0过界,<0安全
overValue = isNegative * value - Integer.MAX_VALUE / 10 +
(((isNegative + 1) / 2 + digit > 8) ? 1 : 0);
if (digit < 0 || digit > 9) {
return 0;
} else if (overValue > 0) {
return 0;
}
value = value * 10 + isNegative * digit;
index++;
}
return value;
}