题一:String to Integer (atoi)
主要是要注意这里的输入输出的特列:
题目的要求是:1
1. 前面的空格可以忽略;
2. 第一个非空格要么是整数,要么是'+','-';如过不是这些就返回0;
3. 要考虑整型溢出的情况。
大致就是这么三点
/*------------------------------------atoi -----------------------------------*/
/*LeetCode Accept
需要的测试用例:
+1
1
-1
2147483648 等 需要注意的是 INT_MAX + 1是一个负值。还有就是这里面的测试用例。
*/
int test_atoi(string str)
{
if (str.empty())
return 0;
bool first = 1;
int sign = 1;
long long int value = 0;
for (string::iterator iter = str.begin(); iter != str.end(); iter++)
{
if (first)
{
if (*iter != ' ')
{
if (*iter=='+'||*iter=='-'||isdigit(*iter))
{
first = 0;
*iter == '-' ? sign = -1 : sign;
if (isdigit(*iter))
value = *iter - '0';
}
else
return 0;
}
else
continue;
}
else
{
if (isdigit(*iter))
{
value = value * 10 + *iter - '0';
if (sign == 1 && value > INT_MAX)
{
return INT_MAX;
}
else if (sign == -1 && -value < INT_MIN)
{
return INT_MIN;
}
}
else
{
break;
}
}
}
return value*sign;
}
题二:Reverse Integer
将一个整数逆序,这个题相比上一题还是很直观的,只需要辗转相除然后重新赋值就好。
因为输入是int,所以不会出现输入溢出的情况,但是我们翻转的时候会出现溢出,所以需要考虑,还有一点就是
这里取abs或者取反的时候,INT_MIN 和 -INT_MIN是相同的值,所以要特殊处理。
/*--------------Reverse Integer-------------*/
/*
需要注意的测试用例是:
当输入值是 INT_MIN的时候。
考虑溢出的情况了。所以用long long型来定义。
*/
int reverse(int x)
{
bool negative = false;//是否为负数
if (x == INT_MIN) //INT_MIN = -INT_MIN 仍然是个负数,所以特别做判断
return 0;
if (x<0)
{
negative = true;
x = -x;
}
long long value = 0;
while (x != 0)
{
value = value * 10 + x % 10;
x /= 10;
}
if (value>INT_MAX)
return 0;
if (negative)
return -value;
else
return value;
}
题三:Palindrome Number
判断一个数是不是回文数:
题目里面给的提示是 对于负数直接考虑不是回文,使得问题简单多了。
刚开始我认为负数可以当做回文,怎么提交都出现错误,
从第二题到第三题就很简单了,我仍然用的是将一个整数逆序,只要加一个是不是溢出的判断就可以了。
/*-----------------判断是不是回文数-----------------------*/
/*
如果是负数,直接返回false.
计算过程中,如果逆序之后是溢出的直接返回false.
*/
bool isPalindrome(int x) {
if (x < 0)
return false;
int y = x;
long long value = 0;
while (x != 0)
{
value = value * 10 + x % 10;
x /= 10;
}
if (value > INT_MAX)
return false;
if (y == value)
return true;
else
return false;
}
如果不允许使用reverse整数的话,因为可能导致溢出,那么就可以使用最原始的分离数字的方法,每次分离出最高位最低位,次高位,次地位,进行判断。
/*分离数字方法*/
bool isPalindrome2(int x)
{
if (x < 0)
return false;
if (x < 10)
return true;
int count = 0, y=x;
while (y != 0)
{
y /= 10; //统计位数
count++;
}
int left = 1;
int right = pow(10, count);
while (right>left)
{
if (x / right % 10 != x / left % 10)
return false;
right /= 10;
left *= 10;
}
return true;
}
未完待续。