Leetcode 反转整数+回文数 相关知识点
反转整数
题目
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
知识点
整形、长整型、浮点型 边界值
- int型边界最大值:Integer.MAX_VALUE
- int型边界最小值:Integer.MIN_VALUE
- long型边界最大值:Long.MAX_VALUE
- long型边界最小值:Long.MIN_VALUE
- float型边界最大值:Float.MAX_VALUE
- float型边界最小值:Float.MIN_VALUE
整形与长整型之间的转换
不要直接将数据类别强制转换,会编译出错。
较好方式有两种(long a = 23;)
- 借助Long类:
int new_a = new Long(a).intValue(); - 借助字串:
int new_a = Integer.parseInt(String.valueOf(y));
解法
其实将整数反转并不难,每次将旧整数的最后一位取余放到新整数的后面即可。当然我们也可以将整数变为字串,用字符两两交换的方法,只是效率会更低。
对于大多数人来说,这道题最容易忽略的地方在于,数值溢出的判定条件。我想到的方式有两种:
- 解法一:将逆序后的值直接与边界值比较。
public int reverse(int x) {
long y = 0;
while(x != 0){
y = y*10 + x%10;
x = x/10;
}
if(y < Integer.MIN_VALUE || y > Integer.MAX_VALUE){
return 0;
}
else{
//return new Long(y).intValue();
return Integer.parseInt(String.valueOf(y));
}
}
- 解法二:将逆序的整数先用long型表示,看逆序数long型和int型数值是否一致。
public int reverse(int x) {
long y = 0;
while(x != 0){
y = y*10 + (x%10);
x = x/10;
}
int y1 = new Long(y).intValue();
if(y1 != y){
return 0;
}
else{
return y1;
}
}
回文数
题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
知识点
缺省数据类型&对应类
原始类型 | 封装类 |
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
Number类常用方法
- xxxValue():将Number对象转化为xxx数据类型的值并返回
– byteValue():以byte形式返回指定的数值
– doubleValue():以double形式返回指定的数值
– floatValue():以float形式返回指定的数值
– intValue():以int形式返回指定的数值
– longValue():以long形式返回指定的数值
– shortValue():以short形式返回指定的数值
Long a = new Long(13546);
b = a.intValue();
// Integer i = 1;
// Integer n = Integer.valueOf(1);
Integer i = new Integer(1);
int j = i.floatValue();
- public int compareTo(NumberSubClass referenceName):将number对象与参数比较,返回number对象值-参数的差值
int x = 1; // x是一个整形数
Integer y = new Integer(2); // y是一个整形类
return y.compareTo(x); // 返回d为1
- public boolean equals(Object o):判断number对象是否与参数
int x = 5;
Integer y = 10;
Integer z = 5;
return y.equal(x); // 返回false
return z.equal(x); //返回true
- valueof():返回一个Number对象指定的内置数据类型
– Integer valueOf(int i):返回一个表示指定int型的Integer实例
– Integer valueOf(String s):返回一个表示指定String型的Integer实例
– Integer valueOf(String s, int radix):返回一个Integer对象,该对象中保存了用第二个参数提供的基数进行解析是从指定Sting中提取的值
Integer b = Integer.valueOf("444",16); //使用16进制
- toString():返回以一个字符串表示的Number对象值
– String toString()
– static String toString(int i)
Integer x = 5;
return x.toString();
return Integer.toString(12);
- parseInt():将字符串解析为int类型
– static int parseInt(String s)
– static int parseInt(String s, int radix)
int x = Integer.parseInt("9");
double c = Double.parseDouble("5");
int b = Integer.parseInt("444",16); //基数“444”为16进制
Math类常用方法
- abs():返回参数的绝对值
- ceil():返回大于等于(>=)给定参数的最小整数
- floor():返回小于等于(<=)给定参数的最大整数
- rint():返回与参数最接近的整数,返回类型为double。
- round():对数字进行四舍五入。算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整。所以Math.round(11.5)=12,而Math.round(-11.5)=11。
- min():返回两个参数中的最小值
- max():返回两个参数中的最大值
- exp():返回自然数底数e的参数次方
- log():返回参数的自然数底数的对数值
- pow():返回第一个参数的第二个次方
- sqrt():求参数的算术平方根
- sin():求指定double类型参数的正弦值
- cos():求指定double类型参数的余弦值
- tan():求指定double类型参数的正切值
- toRadians():将角度转化为弧度
- toDegrees():将参数转化为角度
- random():返回一个随机数
解法
想要解这道题,首先要理解回文数的意义,抓两个重点:一是对象——整数;二是左一等于右一,左二等于右二依次类推。还有种情况可以直接排除,只要整数为负则一定是非回文数。
方法一:将整数逆序,然后将逆序前后的数字比较是否一致。当然这种情况需要先判断数字书否为负。
class Solution {
public boolean isPalindrome(int x) {
if(x < 0) return false;
else{
int y = 0;
int x1 = x;
while(x1 != 0){
y = y*10+x1%10;
x1 = x1/10;
}
if(x == y) return true;
else return false;
}
}
}
方法二:先求数字的长度。通过求商求余逐个将最高位与最低位相比较,相同的话比较次高位和次低位。如果在过程中发现不同,则为非回文数;只有当所有高低位均相同时,才为回文数。
class Solution {
public boolean isPalindrome(int x) {
if(x < 0){
return false;
}
else{
int y = 0;
int x1 = x;
while(x1 != 0){
y = y*10+x1%10;
x1 = x1/10;
}
if(x == y){
return true;
}
else{
return false;
}
}
}
}
方法三:是方法二的变种,思路是相同的,不同之处在于,法三直接将数字转换为字符串求解,这样代码相对简单。
注释中讲解了int转String常见的三种方法。
class Solution {
public boolean isPalindrome(int x) {
// String s = String.valueOf(x); //法一:int转String
// String s = x+""; //法二:int转String
String s = Integer.toString(x); //法三:int转String
char[] ch = s.toCharArray();
// System.out.println(ch[0]); //只有将String转换成char[]才能对字串中每个字符进行修改
// int len = s.length(); //String获取字串长度
int high = ch.length-1; //数组获取字串长度
int low = 0;
while(low < high){
if(ch[low] != ch[high]){
return false;
}
low += 1;
high -= 1;
}
return true;
}
}