题目描述java
给出一个 32 位的有符号整数,你须要将这个整数中每位上的数字进行反转。git
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设咱们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,若是反转后整数溢出那么就返回 0。
复制代码
题意理解bash
传入一个32位的有符号整数,返回它倒置之后的数。前面的0不须要返回,若倒置后超出32位范围则返回0.函数
思路ui
这题解法较多。spa
1.转换成字符串处理code
刚看完题目个人第一想法是把整数转成StringBuilder后直接用reverse方法反转,而后再转成int类型返回,要注意传入负数时要在最后加上负号。字符串
2.在线处理字符串处理
这个方法是在评论区看到的,应该是这个问题的最优解。思路主要是用一个整数从后往前获取x的每一位值,用另外一个整数记录每次过程的中间值。每次判断中间值整除10与前一次的中间值是否相同,若不一样则说明溢出。string
ACCode
class Solution {
public int reverse(int x) {
int flag = x < 0? -1 : 1;
String xx = String.valueOf(Math.abs(x));
String r = new StringBuilder(xx).reverse().toString();
try{
int result = flag * Integer.parseInt(r);
return result;
}catch(Exception e){
return 0;
}
}
}
复制代码
class Solution {
public int reverse(int x) {
/** ret 保存旧的翻转中间值, temp 保存新的翻转过程当中间值 依次提取 x 的末位加入 temp, 若是发生溢出则经过temp/10 没法获得上一轮的翻转结果 ret **/
int ret = 0;
while(x != 0) {
int temp = ret*10 + x%10;
if(temp / 10 != ret)
return 0;
ret = temp;
x /= 10;
}
return ret;
}
}
复制代码
题目描述
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据须要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当咱们寻找到的第一个非空字符为正或者负号时,则将该符号与以后面尽量多的连续数字组合起来,做为该整数的正负号;假如第一个非空字符是数字,则直接将其与以后连续的数字字符组合起来,造成整数。
该字符串除了有效的整数部分以后也可能会存在多余的字符,这些字符能够被忽略,它们对于函数不该该形成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不须要进行转换。
在任何状况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设咱们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31, 2^31 − 1]。若是数值超过这个范围,返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。
示例 1:
输入: "42"
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
咱们尽量将负号与后面全部连续出现的数字组合起来,最后获得 -42 。
示例 3:
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,由于它的下一个字符不为数字。
示例 4:
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
所以没法执行有效的转换。
示例 5:
输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
所以返回 INT_MIN (−2^31) 。
复制代码
题意理解
本题要求实现atoi方法,传入一个字符串从第一个非空格字符开始提取出连续的整数包括负数,取出的整数需在规定范围内。须要注意的是“- 123” 返回的应该是0,由于负号后的第一个字符不是数字。还有题目中没有说起正号开头的状况,要注意这种状况也是合理的。
思路
刚开始想的是逐个字符判断过去,写的过程当中产生了大量的if嵌套,致使逻辑混乱。后来发现是个人分类方式有问题,如无论是不是负号开头后面取出数字的逻辑是相同的。把问题分析清楚,提取出逻辑相同的部分就很简单了,具体的逻辑看下面的代码。
ACCode
class Solution {
public int myAtoi(String str) {
int MAX = 0x7fffffff;
int MIN = 0x80000000;
int UP = MAX / 10;
int DOWN = MIN / 10;
str = str.trim();
if(str.isEmpty()) return 0;
int ans = 0;
int sign = 1;
char c = str.charAt(0);
if('+'==c);
else if('-'==c)sign = -1;
else if(Character.isDigit(c))ans = c-'0';
else return 0;
for(int i=1; i<str.length(); ++i){
c = str.charAt(i);
if(!Character.isDigit(c))break;
int n = c-'0';
//判断目前的值(ans)在加入下一个数字后会不会超过INT_MAX,
if(ans>UP||(ans==UP&&n>7)){ans=MAX;break;}
//同理,判断负数加入下一个数字会不会超过INT_MIN
if(ans<DOWN||(ans==DOWN&&n>8)){ans=MIN;break;}
ans = ans*10 + sign*n;
}
return ans;
}
}
复制代码
题目描述
判断一个整数是不是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是同样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。所以它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。所以它不是一个回文数。
复制代码
进阶:
你能不将整数转为字符串来解决这个问题吗?
题目理解
本题题意较简单,判断传入的数倒置之后是否和原来同样便可。
思路
若是转成字符串能够直接两行搞定,可是时间复杂度太大。
这里就简单地求出反转后的数字与原来的整数比较便可。
ACCode
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) return false;
int y = 0, dit = 0;
int temp = x;
while (temp != 0) {
dit = temp % 10;
y = y * 10 + dit;
temp /= 10;
}
return x == y;
}
}
复制代码