整数反转
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
解题思路
x%10 取一位,x/10下一位,注意越界,
代码实现
class Solution {
public:int reverse(int x) {int sum = 0;while(x){if(sum<INT_MIN/10) return 0;if(sum>INT_MAX/10)return 0;sum=sum*10+x%10;x/=10;}return sum;}
};
字符串转整数
题目描述
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
解题思路
第一步
去除字符串中的所有空格,只记录有效字符的下标
如果都是空格,就直接返回0
int length = s.size();
int index = 0;
while(index < length)
{if(s[length] != ' ')break;index++;
}
if(index == length)return 0;
第二步
判断正负,用个标记为来表示,起初为正
int signal = 1;
if(s[index] = '+')index++;
else if(s[index] = '-')
{ singal = -1;index++;
}
第三步
转换,首先判断是否越界,再进行转换,
int res = 0; //保存结果
while(index<legnth)
{//1.取一个字符char Cur = s[index];//2.判断是否为数字字符if(Cur < '0' || Cur >'9')break;//3.判断是否越界if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10)) {return INT_MAX;}if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10))) {return INT_MIN;}//4.转换res = res*10 + signal*(Cur - '0');//5.取下一个字符index++;
}
代码实现
class Solution {
public:int myAtoi(string str) {unsigned long len = str.length();int index = 0;while (index < len) {if (str[index] != ' ') {break;}index++;}//如果全部是空格,直接返回0if (index == len) {return 0;}int sign = 1;if (str[index] == '+') {index++;} else if (str[index] == '-') {sign = -1;index++;}int res = 0;while (index < len) {char curChar = str[index];if (curChar < '0' || curChar > '9') {break;}if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10)) {return INT_MAX;}if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10))) {return INT_MIN;}res = res * 10 + sign * (curChar - '0');index++;}return res;}
};