LeetCode 7

来源:互联网 发布:棋牌透视软件下载 编辑:程序博客网 时间:2024/06/05 09:59

荒废了几天之后,再写一次题解。

Problem 7 Reverse Integer

题目很简单,把给定的数转置,也就是倒过来写。大体思路就是把int转成string,然后倒序输出即可。

然而这里有两个问题,第一个是负数的问题。这个比较好解决,在转换成 string之前先判断是否小于零,最后把负号加上就好了。第二个问题比较棘手,那就是转置之后的数据有可能发生溢出,按照题目的要求发生溢出时应返回0。一个简单的方法是,既然作为int会溢出,那么我用long long存那肯定是不会溢出的。好的,现在问题就变成如何判断溢出了,这就只需要和INT_MAXINT_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;}

Problem 8 String to Integer (atoi)

不得不说,对我而言,这个题目有些复杂,需要考虑几种情况,我们一步步来。
首先,对于给定的字符串,题目要求从第一个非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;}

Problem 9 Palindrome Number

判断回文数,经典题目。但也确实简单,把它抓换成 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;}
0 0
原创粉丝点击