###### 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 } } ``` 途中コメントになっているやり方の方がコードが短いけど、自分ではこれは考えつかなそう。