荒废了几天之后,再写一次题解。
题目很简单,把给定的数转置,也就是倒过来写。大体思路就是把int转成string,然后倒序输出即可。
然而这里有两个问题,第一个是负数的问题。这个比较好解决,在转换成 string之前先判断是否小于零,最后把负号加上就好了。第二个问题比较棘手,那就是转置之后的数据有可能发生溢出,按照题目的要求发生溢出时应返回0。一个简单的方法是,既然作为int会溢出,那么我用long long存那肯定是不会溢出的。好的,现在问题就变成如何判断溢出了,这就只需要和INT_MAX和INT_MIN做个比较就可以得出结果。
这里顺便提一下C++中数字和字符串的互相转换问题。利用函数to_string()可以将数字转化成字符串,接受的数据类型以及用法参考这里。而如果想把字符串转换成数字,那么可以使用stoX(),这里的 X 就是一个数据类型,例如stoi()就是将字符串转化成int类型。更加详细的用法及说明参考这里
int reverse(int x) { bool is_above_zero = (x == abs(x)); string temp = to_string(x); int size = temp.length(); string result_string = ""; if (!is_above_zero) result_string = "-"; for (int i = size - 1; i >= 0; i--) { result_string += temp[i]; } long long result = stoll(result_string); if (result < INT_MIN || result > INT_MAX) result = 0; return result; }不得不说,对我而言,这个题目有些复杂,需要考虑几种情况,我们一步步来。 首先,对于给定的字符串,题目要求从第一个非whitespace的字符开始转换,如果- +号之后的第一个字符不是数字,那么转换终止,返回 0; 若转换继续,我们需要记录下来- +号,随后,开始读取“数字”。 注意,这里的数字不一定是数字,如果读到一个不是数字的字符,那么转换终止,并且尝试返回当前已经转换的数字。 这里说尝试,那是因为需要转换成int类型,那么就要判断是否溢出。对于溢出的判断上一题已给出方法,这里依然是通过long long来完成。
了解以上基本步骤之后,我们还有一些代码上问题需要注意。
int myAtoi(string str) { long long result = 0; int size = str.length(); bool start = false, first = true, below_zero = false; for (int i = 0; i < size; i++) { if (!start && isspace(str[i])) continue; // start == true 开始转换后一旦发现不是数字的字符立刻终止 if (start && !(str[i] >= '0' && str[i] <= '9')) break; start = true; // 转换开始后判断第一个字符是 - 还是 +,并记录结果 if (first && (str[i] == '-')) { start = true; below_zero = true; first = false; continue; } else if (first && str[i] == '+') { start = true; first = false; continue; } if (!(str[i] >= '0' && str[i] <= '9')) break; if (below_zero) { result *= 10; result -= (str[i] - '0'); } else result = 10 * result + (str[i] - '0'); if (result > INT_MAX || result < INT_MIN) { result = (result > 0 ? INT_MAX : INT_MIN); break; } } return result; }判断回文数,经典题目。但也确实简单,把它抓换成 string 之后就很方便,从头从尾向中心靠拢。主要就是一个循环结束条件。对于奇数个数,当头和尾相等时循环结束;偶数个数,头 - 尾 = 1时循环结束。为了让代码在只有一个数的情况下也能确保正确,再加上给下标设定取值范围[0,size - 1]
bool isPalindrome(int x) { if (x < 0) return false; string num = to_string(x); int size = num.length(); int i = 0, j = size - 1; do { if (num[i] != num[j]) return false; i++, j--; } while (!(i == j || i - j == 1) && j >= 0 && i < size); return true; }