判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-number
一道来自leetcode的题目“回文数”。
简单分析
回文数的特征,正着和反着是完全一样的数字。
根据例子,负数由于负号的关系始终不能是回文数,所以遇到负数可以直接判定为假。
单独的个位数一定是回文数。
方法
一种可以转换为字符串,倒序后比较,另一种可以使用数字计算,低位通过计算转换为高位数,比较新数字与原数。
这里采用第二种,代码很简单:
fn is_palindrome(x: i32) -> bool { // 负数和个位数直接返回 if x < 0 {return false;} if x >= 0 && x < 10 {return true;}
let mut new_x = 0; let mut tmp_x = x;
while tmp_x > 0 { // 从低位开始依次转换为高位 new_x = new_x * 10 + tmp_x % 10; tmp_x /= 10; }
new_x == x}
字符串比较的方法
fn is_palindrome(x: i32) -> bool { if x < 0 {return false;} if x >= 0 && x < 10 {return true;} //转换为字符串 let origin = x.to_string(); //倒置字符串 let new_s = String::from_utf8(s.bytes().rev().collect::<Vec<u8>>()).unwrap(); origin == new_s}
to_string():数字转字符串
bytes():获取字符串的字节类型迭代器
rev():倒置一个迭代器的内容
collect():收集迭代数据为Vec<u8>类型
from_utf8:从Vec<u8>转换为字符串,返回Result类型
?END