C++实现LeetCode(8.字符串转为整数)

 更新时间:2021年07月12日 09:17:24   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(8.字符串转为整数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 8. String to Integer (atoi) 字符串转为整数

Implement atoi which converts a string to an integer.

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned.

Note:

  • Only the space character ' ' is considered as whitespace character.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. If the numerical value is out of the range of representable values, INT_MAX (231 − 1) or INT_MIN (−231) is returned.

Example 1:

Input: "42"
Output: 42

Example 2:

Input: "   -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
Then take as many numerical digits as possible, which gets 42.

Example 3:

Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.

Example 4:

Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical
digit or a +/- sign. Therefore no valid conversion could be performed.

Example 5:

Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer.
Thefore INT_MIN (−231) is returned.

字符串转为整数是很常用的一个函数,由于输入的是字符串,所以需要考虑的情况有很多种。博主之前有一篇文章是关于验证一个字符串是否为数字的,参见 Valid Number。在那篇文章中,详细的讨论了各种情况,包括符号,自然数,小数点的出现位置,判断他们是否是数字。个人以为这道题也应该有这么多种情况。但是这题只需要考虑数字和符号的情况:

1. 若字符串开头是空格,则跳过所有空格,到第一个非空格字符,如果没有,则返回0.

2. 若第一个非空格字符是符号 +/-,则标记 sign 的真假,这道题还有个局限性,那就是在 c++ 里面,+-1 和-+1 都是认可的,都是 -1,而在此题里,则会返回0.

3. 若下一个字符不是数字,则返回0,完全不考虑小数点和自然数的情况,不过这样也好,起码省事了不少。

4. 如果下一个字符是数字,则转为整形存下来,若接下来再有非数字出现,则返回目前的结果。

5. 还需要考虑边界问题,如果超过了整型数的范围,则用边界值替代当前值。

C++ 解法:

class Solution {
public:
    int myAtoi(string str) {
        if (str.empty()) return 0;
        int sign = 1, base = 0, i = 0, n = str.size();
        while (i < n && str[i] == ' ') ++i;
        if (i < n && (str[i] == '+' || str[i] == '-')) {
            sign = (str[i++] == '+') ? 1 : -1;
        }
        while (i < n && str[i] >= '0' && str[i] <= '9') {
            if (base > INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
                return (sign == 1) ? INT_MAX : INT_MIN;
            }
            base = 10 * base + (str[i++] - '0');
        }
        return base * sign;
    }
};

Java 解法:

public class Solution {
    public int myAtoi(String str) {
        if (str.isEmpty()) return 0;
        int sign = 1, base = 0, i = 0, n = str.length();
        while (i < n && str.charAt(i) == ' ') ++i;
        if (i < n && (str.charAt(i) == '+' || str.charAt(i) == '-')) {
            sign = (str.charAt(i++) == '+') ? 1 : -1;
        }
        while (i < n && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
            if (base > Integer.MAX_VALUE / 10 || (base == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7)) {
                return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            base = 10 * base + (str.charAt(i++) - '0');
        }
        return base * sign;
    }
}

到此这篇关于C++实现LeetCode(8.字符串转为整数)的文章就介绍到这了,更多相关C++实现字符串转为整数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV实现图像切割功能

    OpenCV实现图像切割功能

    这篇文章主要为大家详细介绍了OpenCV实现图像切割功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++小知识:用合适的工具来分析你的代码

    C++小知识:用合适的工具来分析你的代码

    今天小编就为大家分享一篇关于C++小知识:用合适的工具来分析你的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • VC++ 自定义控件的建立及使用方法

    VC++ 自定义控件的建立及使用方法

    这篇文章主要介绍了VC++ 自定义控件的建立及使用方法的相关资料,十分的详细,需要的朋友可以参考下
    2015-06-06
  • C/C++ 编译器优化介绍

    C/C++ 编译器优化介绍

    这篇文章主要涉及了C/C++ 编译器优化的简单介绍,具有一定参考价值。如有不对之处,欢迎指出。
    2017-09-09
  • Qt QImage和QPixmap使用与区别

    Qt QImage和QPixmap使用与区别

    Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap,本文主要介绍了Qt QImage和QPixmap使用与区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • C语言实现简单飞机大战

    C语言实现简单飞机大战

    这篇文章主要为大家详细介绍了C语言实现简单飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • c++加法高精度算法的简单实现

    c++加法高精度算法的简单实现

    下面小编就为大家带来一篇c++加法高精度算法的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C语言实现随机抽取纸牌程序

    C语言实现随机抽取纸牌程序

    这篇文章主要为大家详细介绍了C语言实现随机抽取纸牌程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++实现LeetCode(167.两数之和之二 - 输入数组有序)

    C++实现LeetCode(167.两数之和之二 - 输入数组有序)

    这篇文章主要介绍了C++实现LeetCode(167.两数之和之二 - 输入数组有序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 浅析C++ atomic 和 memory ordering

    浅析C++ atomic 和 memory ordering

    这篇文章主要介绍了C++ atomic 和 memory ordering的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论