Skip to content

Commit 04435fb

Browse files
committed
leetcode 7. Reverse Integer
1 parent f1d50fc commit 04435fb

3 files changed

Lines changed: 163 additions & 0 deletions

File tree

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
この解法は、64ビット整数を使わずに、32ビット整数の範囲を超えないかを都度チェックしながら桁を逆にしていきます。
2+
3+
---
4+
5+
### ✅ TypeScriptコード(`fs`での入力読み取り対応)
6+
7+
```ts
8+
import * as fs from 'fs';
9+
10+
const input = fs.readFileSync('/dev/stdin', 'utf8').trim();
11+
const x = parseInt(input);
12+
13+
/**
14+
* 32ビット整数の範囲
15+
*/
16+
const INT_MIN = -(2 ** 31);
17+
const INT_MAX = 2 ** 31 - 1;
18+
19+
function reverse(x: number): number {
20+
let result = 0;
21+
let num = x;
22+
23+
while (num !== 0) {
24+
const digit = num % 10 | 0; // 小数点対策で |0 して整数化
25+
num = (num / 10) | 0;
26+
27+
// resultが次の桁を追加したときにオーバーフローしないか確認
28+
if (
29+
result > Math.floor(INT_MAX / 10) ||
30+
(result === Math.floor(INT_MAX / 10) && digit > 7)
31+
) {
32+
return 0;
33+
}
34+
if (
35+
result < Math.ceil(INT_MIN / 10) ||
36+
(result === Math.ceil(INT_MIN / 10) && digit < -8)
37+
) {
38+
return 0;
39+
}
40+
41+
result = result * 10 + digit;
42+
}
43+
44+
return result;
45+
}
46+
47+
console.log(reverse(x));
48+
```
49+
50+
---
51+
52+
### 🔍 処理概要(図付きで説明)
53+
54+
たとえば `x = -123` のとき:
55+
56+
```
57+
初期状態: result = 0, num = -123
58+
59+
ループ1:
60+
digit = -123 % 10 = -3
61+
num = -123 / 10 = -12
62+
result = 0 * 10 + (-3) = -3
63+
64+
ループ2:
65+
digit = -12 % 10 = -2
66+
num = -12 / 10 = -1
67+
result = -3 * 10 + (-2) = -32
68+
69+
ループ3:
70+
digit = -1 % 10 = -1
71+
num = -1 / 10 = 0
72+
result = -32 * 10 + (-1) = -321
73+
74+
終了(num === 0)→ return -321
75+
```
76+
77+
---
78+
79+
### 🛑 オーバーフローの例
80+
81+
例:`x = 1534236469`
82+
83+
```
84+
途中で result = 964632435 になり、
85+
次の桁(9)を追加すると 9646324350 + 9 = 9646324359 > INT_MAX
86+
→ return 0
87+
```
88+
89+
---
90+
91+
### ✅ テストケース例
92+
93+
```plaintext
94+
Input:
95+
123
96+
Output:
97+
321
98+
99+
Input:
100+
-123
101+
Output:
102+
-321
103+
104+
Input:
105+
120
106+
Output:
107+
21
108+
109+
Input:
110+
1534236469
111+
Output:
112+
0
113+
```
114+
115+
---
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import * as fs from 'fs';
2+
3+
const input = fs.readFileSync('/dev/stdin', 'utf8').trim();
4+
const x = parseInt(input);
5+
6+
/**
7+
* 32ビット整数の範囲
8+
*/
9+
const INT_MIN = -(2 ** 31);
10+
const INT_MAX = 2 ** 31 - 1;
11+
12+
function reverse(x: number): number {
13+
let result = 0;
14+
let num = x;
15+
16+
while (num !== 0) {
17+
const digit = num % 10 | 0; // 小数点対策で |0 して整数化
18+
num = (num / 10) | 0;
19+
20+
// resultが次の桁を追加したときにオーバーフローしないか確認
21+
if (
22+
result > Math.floor(INT_MAX / 10) ||
23+
(result === Math.floor(INT_MAX / 10) && digit > 7)
24+
) {
25+
return 0;
26+
}
27+
if (
28+
result < Math.ceil(INT_MIN / 10) ||
29+
(result === Math.ceil(INT_MIN / 10) && digit < -8)
30+
) {
31+
return 0;
32+
}
33+
34+
result = result * 10 + digit;
35+
}
36+
37+
return result;
38+
}
39+
40+
console.log(reverse(x));

DataStructures/Trees/BinaryIndexedTree/FenwickTree/atcoder/A76/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,11 @@ dp: 1 0 1 2 2 1 7
127127
| 最終出力 | `dp[ゴールのインデックス]` が答え |
128128

129129
---
130+
131+
| [提出日時](https://atcoder.jp/contests/tessoku-book/submissions/me?desc=true&orderBy=created) | 問題 | ユーザ | 言語 | [得点](https://atcoder.jp/contests/tessoku-book/submissions/me?desc=true&orderBy=score) | [コード長](https://atcoder.jp/contests/tessoku-book/submissions/me?orderBy=source_length) | 結果 | [実行時間](https://atcoder.jp/contests/tessoku-book/submissions/me?orderBy=time_consumption) | [メモリ](https://atcoder.jp/contests/tessoku-book/submissions/me?orderBy=memory_consumption) | |
132+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
133+
| 2025-07-01 18:36:39 | [A76 - River Crossing](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_bx) | [myoshizumi](https://atcoder.jp/users/myoshizumi) | [PHP (php 8.2.8)](https://atcoder.jp/contests/tessoku-book/submissions/me?f.Language=5016) | 1000 | 2451 Byte | | 248 ms | 46648 KiB | [詳細](https://atcoder.jp/contests/tessoku-book/submissions/67219001) |
134+
| 2025-07-01 18:33:18 | [A76 - River Crossing](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_bx) | [myoshizumi](https://atcoder.jp/users/myoshizumi) | [Go (go 1.20.6)](https://atcoder.jp/contests/tessoku-book/submissions/me?f.Language=5002) | 1000 | 1925 Byte | | 56 ms | 15992 KiB | [詳細](https://atcoder.jp/contests/tessoku-book/submissions/67218947) |
135+
| 2025-07-01 18:27:47 | [A76 - River Crossing](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_bx) | [myoshizumi](https://atcoder.jp/users/myoshizumi) | [Python (CPython 3.11.4)](https://atcoder.jp/contests/tessoku-book/submissions/me?f.Language=5055) | 1000 | 1741 Byte | | 473 ms | 39756 KiB | [詳細](https://atcoder.jp/contests/tessoku-book/submissions/67218847) |
136+
| 2025-07-01 18:16:16 | [A76 - River Crossing](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_bx) | [myoshizumi](https://atcoder.jp/users/myoshizumi) | [TypeScript 5.1 (Node.js 18.16.1)](https://atcoder.jp/contests/tessoku-book/submissions/me?f.Language=5058) | 1000 | 2371 Byte | | 150 ms | 86184 KiB | [詳細](https://atcoder.jp/contests/tessoku-book/submissions/67218646) |
137+
| 2025-07-01 18:14:02 | [A76 - River Crossing](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_bx) | [myoshizumi](https://atcoder.jp/users/myoshizumi) | [JavaScript (Node.js 18.16.1)](https://atcoder.jp/contests/tessoku-book/submissions/me?f.Language=5009) | 1000 | 2694 Byte | | 183 ms | 88068 KiB | [詳細](https://atcoder.jp/contests/tessoku-book/submissions/67218589) |

0 commit comments

Comments
 (0)