题目:8. 字符串转换整数 (atoi)
【中等难度】请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
- 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
- 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
- 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
- 假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
- 在任何情况下,若函数不能进行有效的转换时,请返回 0 。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 231 − 1 或 −231 。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入: “4193 with words”
输出: 4193
解题思路
1、将字符串转换为char数组,再遍历。
2、处理字符的特殊情况:
(1)前面的空格
(2)正负号
(3)数字以外的字符
3、判断int数值是否越界
(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && r > Integer.MAX_VALUE % 10)
4、数组越界的情况:在去除空格后,要注意可能有数组越界的情况:比如一个空格的时候“ ”
执行代码
class Solution {
public int myAtoi(String s) {
char[] Array = s.toCharArray();
int flag = 1,i =0,res =0;
int len = s.length();
if(len==0)
return 0;
while(i<len && Array[i] == ' ') i++;
if (i == len)
return 0;
char firstChar = Array[i];
if(firstChar == '-')
flag = -1;
if(firstChar == '-'||Array[i] == '+')
i++;
while(i<Array.length){
int r = Array[i]-'0';
if(r<0||r>9)
break;
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && r > Integer.MAX_VALUE % 10)) {
return flag>0?Integer.MAX_VALUE:Integer.MIN_VALUE;
}
res = res*10+r;
i++;
}
return flag>0?res:-res;
}
}
复杂度
时间复杂度:O(n)
空间复杂度:O(n)
题目:7. 整数翻转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路
1、解法一:堆栈,时间复杂度o(n),空间复杂度o(n);
2、解法二:归纳数学公式,取余,再聚合。
解法二执行代码
class Solution {
public int reverse(int x) {
double result = 0;
int flag = x>=0?1:-1;
x = Math.abs(x);
while(x>0){
result = result*10 + x%10;
x = x/10;
}
if(result*flag>Math.pow(2,31)-1||result*flag<Math.pow(2,31)*(-1))
return 0;
return (int)result*flag;
}
}
复杂度
时间复杂度:O(n)
空间复杂度:O(1)
题目:9. 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
思路
1、转换为chars数组,再用两个指针遍历对比大小
2、本人试了不转换为字符串的解法,但比较复杂,预估的计算时间比用字符串的解法长,所以就放弃写下去了。
执行代码
class Solution {
public boolean isPalindrome(int x) {
if(x<0)
return false;
char[] charArray = (x+"").toCharArray();
int left = 0,right = charArray.length-1;
while (left < right) {
if (charArray[left] != charArray[right])
return false;
left++;
right--;
}
return true;
}
}
复杂度
时间复杂度:O(n)
空间复杂度:O(n)