LeetCode-探索-一次-文字列-整数反転-java
2597 ワード
32ビットのシンボル付き整数を与えます.この整数の各ビットの数字を反転する必要があります.
例 1:
例2:
例3:
注意:
我々の環境では32ビットの符号付き整数しか記憶できないと仮定すると、その数値範囲は [−231, 231 − 1].この仮定に基づいて、反転後に整数がオーバーフローした場合は0を返します.
方法はたくさんあります.最初の方法は:
反転に関連する限り、まず配列内の反転方法を考えます.
1 intをStringに変換し、char[]に変換
2 char[]で反転を完了
3オーバーフロー判定
2つ目の方法:
反転にかかわるものは、スタックというデータ構造を思わないのは難しいです.はい、スタックを通じて反転することができます.
3つ目の方法:
整数型であるため(あるいは数値型がより適切である)、数学的な方法で数値の逆転を行うことができます.
数値反転はオーバーフローの問題を考慮する必要があります.
例 1:
: 123
: 321
例2:
: -123
: -321
例3:
: 120
: 21
注意:
我々の環境では32ビットの符号付き整数しか記憶できないと仮定すると、その数値範囲は [−231, 231 − 1].この仮定に基づいて、反転後に整数がオーバーフローした場合は0を返します.
方法はたくさんあります.最初の方法は:
反転に関連する限り、まず配列内の反転方法を考えます.
1 intをStringに変換し、char[]に変換
2 char[]で反転を完了
3オーバーフロー判定
public int reverse(int x) {
int signal = 1;
if (x < 0)
signal = -1;
String target = signal * x + ""; //omit the signal
char[] chars = target.toCharArray();
char temp = 0;
int symmetryI = 0;
for (int i = 0 ; i < target.length() >> 1 ; i ++) {
symmetryI = target.length() - 1 - i;
temp = chars[i];
chars[i] = chars[symmetryI];
chars[symmetryI] = temp;
}
int result = 0;
try {
result = signal * Integer.parseInt(new String(chars));
} catch (NumberFormatException e) {
result = 0;
}
return result;
}
2つ目の方法:
反転にかかわるものは、スタックというデータ構造を思わないのは難しいです.はい、スタックを通じて反転することができます.
public int reverse1(int x) {
java.util.Stack stack = new java.util.Stack();
int signal = 1;
if (x < 0)
signal = -1;
String target = signal * x + "";
char[] chars = target.toCharArray();
for (int i = 0 ; i < chars.length ; i ++)
stack.push(chars[i]);
for (int i = 0 ; i < chars.length ; i ++)
chars[i] = (char)stack.pop();
int result = 0;
try {
result = Integer.parseInt(new String(chars));
} catch (NumberFormatException e) {
result = 0;
}
return signal * result;
}
3つ目の方法:
整数型であるため(あるいは数値型がより適切である)、数学的な方法で数値の逆転を行うことができます.
数値反転はオーバーフローの問題を考慮する必要があります.
public int reverse0(int x) {
int result = 0;
while (x != 0) {
int digit = x % 10; //get the last digit of x.
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit > 7) ||
result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit < -8))
return 0;
result = result * 10 + digit;
x = x / 10; //make the digit before the last become the last one.
}
return result;
}