###### tags: `leetcode` `rust`
# 逆さまにしても同じ数(回文数)
- https://leetcode.com/problems/palindrome-number/
逆さまにしても同じ数になる数(回文数)かどうかを判定するプログラムを Rust で書く。
### 問題
整数の x が与えられる。逆さまにしても同じならば true を返却する。
x の範囲は $-2^{31} <= x <= 2^{31} - 1$
### 例
121 は true で、123 は false になる。
```rust=
x = 121 // true
x = 123 // false
x = -121 // false
x = 10 // false
```
### 初期コード
is_palindrome 関数を完成させる。
```rust=
impl Solution {
pub fn is_palindrome(x: i32) -> bool {
}
}
```
### アルゴリズム
- 0 の場合は true
- マイナス値の場合、10 で割り切れる値の場合は false
- その他の値の場合は、x を文字列にして 1文字ずつ読み込む
- 前半の文字は stack に入れて、後半の文字は stack から取り出して同じ値になっていなければ false
- 最後まで残れば true
### 完成したコード
```rust=
impl Solution {
pub fn is_palindrome(x: i32) -> bool {
// 0 は true
if x == 0 {
return true;
// マイナス値は false
} else if x < 0 {
return false;
// 10 で割り切れる場合は false
} else if x % 10 == 0 {
return false;
}
/*
let mut revertedNumber = 0;
let mut inputNumber = x;
while(inputNumber > revertedNumber) {
revertedNumber = revertedNumber * 10 + inputNumber % 10;
inputNumber /= 10;
}
return inputNumber == revertedNumber || inputNumber == revertedNumber / 10;
*/
let x_str = x.to_string();
//println!("{:?}", x_str);
let mut vec = Vec::new();
let mut i = 0;
let checkpos = x_str.len() / 2;
for xb in x_str.bytes() {
let xi: i32 = xb as i32 - '0' as i32;
// 真ん中はスルー
if (x_str.len() % 2 != 0) && (i == checkpos) {
// 前半の数値を push
} else if i < checkpos {
vec.push(xi);
// 後半の数値を pop
} else {
if let Some(&cmp) = vec.last() {
if xi != cmp {
return false;
}
vec.pop();
}
}
i += 1;
}
true
}
}
```
途中コメントになっているやり方の方がコードが短いけど、自分ではこれは考えつかなそう。