主要是要注意这里的输入输出的特列:
题目的要求是: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; }
判断一个数是不是回文数:
题目里面给的提示是 对于负数直接考虑不是回文,使得问题简单多了。
刚开始我认为负数可以当做回文,怎么提交都出现错误,
从第二题到第三题就很简单了,我仍然用的是将一个整数逆序,只要加一个是不是溢出的判断就可以了。
/*-----------------判断是不是回文数-----------------------*/ /* 如果是负数,直接返回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; }
未完待续。
原文地址:http://blog.csdn.net/michael_kong_nju/article/details/45092531