Leetcode--8

原题链接:https://leetcode.com/problems/string-to-integer-atoi/#/description

题目:

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button  to reset your code definition.

spoilers alert... click to show requirements for atoi.

Requirements for atoi:

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. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.

题目说明:

实现一个函数,将字符串转换成数字,例如将"123"转换成123。由于输入字符串形式并未指定,所以需要考虑以下五种情况:

1.从第一个非空字符串开始处理。如s=" __123" (_代表空格键)则应该从第三个字符开始处理。

2.要处理字符串前面的“”“”

3.字符串中可能含有非'0'~'9'的字符,遇到这样的字符,该字符后面的字符失效,例如:s="12a3" 应转换为 12.

4.若该字符串中全是空格,则函数不进行任何转换。

5.越界情况,当转换后数字超高int 的最大值或最小值时,返回int型的最大值或最小值 INT_MAX (2147483647) or INT_MIN (-2147483648) 


class Solution {
public:
    int myAtoi(string str) {
        
        //if(str.size()<=0) return;
        int i=0;
        int sign=1;
        long long result=0;
        for(;i<str.size();i++){
            if(str[i]==' '){
                continue;
            }
            else
                break;
        }
        
        //if(i==str.size()-1) return;
        if(str[i]=='+'||str[i]=='-'){
            sign=(str[i++]=='-')?-1:1;
        }
        
        while(str[i]>='0'&&str[i]<='9'&&i<str.size()){
            result=result*10+(str[i++]-'0');
            if(sign*result>=INT_MAX) return INT_MAX;
            if(sign*result<=INT_MIN) return INT_MIN;
        }
        
        
        return sign*result;
    
        
    }
};

处理空格比较简单,第一个for循环可以找到第一个非空格的字符。由于涉及到'+'和'-',所以设置sign符号位,用来表示第一个非空格字符是'+'还是'-'.

在wihle循环的执行条件是字符必须在'0'~'9'之间,且下标没有超出字符串长度,在循环体中,将字符转换成数字。并通过语句

if(sign*result>=INT_MAX) return INT_MAX;
if(sign*result<=INT_MIN) return INT_MIN;
判断是否越界。注意此处的result为long long 类型,其可以表示比INT_MAX大或比INT_MIN小的数字。


另外,看到一段很巧妙的判断是否越界的代码:

int atoi(const char *str) {
    int sign = 1, base = 0, i = 0;
    while (str[i] == ' ') { i++; }
    if (str[i] == '-' || str[i] == '+') {
        sign = 1 - 2 * (str[i++] == '-'); 
    }
    while (str[i] >= '0' && str[i] <= '9') {
        if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
            if (sign == 1) return INT_MAX;
            else return INT_MIN;
        }
        base  = 10 * base + (str[i++] - '0');
    }
    return base * sign;
}
该段程序通过语句
base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7

判断base是否越界,经典的是str[i]-'0'>7;这是因为INT_MAX最大为 2147483647,INT_MAX/10=214748364,最后的个位数字是7.所以只要str[i]-'0'>7那么base肯定就是越界了。。。。

补充知识点:

1.关于INT_MAX与INT_MIN(https://www.quora.com/What-is-INT_MIN-and-INT_MAX-in-C++)

INT_MIN is a macro that expands to the smallest (most negative) value that can be stored in a variable of type int.

INT_MAX is a macro that expands to the largest (most positive) value that can be stored in an int.

On most processors INT_MIN == -INT_MAX - 1, i.e., there is one more negative number than positive number in the range of legal values.

For unsigned int, the corresponding values are 0 and UINT_MAX. Typically UINT_MAX == 2*INT_MAX+1.




要安装 `leetcode-cli` 工具,可以通过以下步骤完成: 1. **克隆项目到本地** 使用 `git` 命令将项目克隆到本地计算机上: ```bash git clone https://github.com/leetcode-cli/leetcode-cli.git cd leetcode-cli ``` 2. **安装工具** 项目提供了基于 Python 的安装方式,确保本地已安装 Python 环境后,使用以下命令安装: ```bash pip install . ``` 3. **登录 LeetCode 账户** 安装完成后,使用 `leetcode login` 命令登录你的 LeetCode 账号,以便在 CLI 中进行题目获取、提交等操作: ```bash leetcode login ``` 该命令会引导你输入 LeetCode 的用户名和密码,完成身份验证[^1]。 4. **验证安装** 可以通过以下命令检查当前 `leetcode-cli` 的版本和运行环境: ```bash leetcode version ``` 该命令将显示当前安装的 CLI 版本、Node.js 版本、操作系统信息以及本地缓存和配置路径等[^5]。 5. **配置个性化设置** 你可以根据需求修改配置文件(通常位于 `~/.lcconfig`),例如设置默认编程语言、编辑器环境变量、代码模板等。支持的配置项包括 `LANG`(默认编程语言)、`USE_COLOR`(是否启用颜色输出)等。 6. **可选:安装插件** 如果希望扩展 `leetcode-cli` 的功能,可以安装 `leetcode-cli-plugins`。该插件集提供了诸如公司标签过滤、本地代码执行、GitHub 提交等功能,进一步提升刷题效率。插件安装方式可以参考其官方文档或 README 文件[^2]。 ### 示例:列出 LeetCode 问题 安装完成后,可以通过以下命令查看 LeetCode 上的题目列表: ```bash leetcode list ``` 该命令会列出所有可用的题目,并可结合插件进行筛选,例如按公司分类或按难度排序[^4]。 ### 示例:创建并提交代码 选择一个题目进行练习,例如编号为 `1` 的题目: ```bash leetcode edit 1 ``` 该命令会自动打开默认编辑器,并生成代码模板(可自定义)。完成代码编写后,使用以下命令执行测试并提交: ```bash leetcode test 1 leetcode submit 1 ``` ### 注意事项 - 确保本地环境已安装 `git` 和 `pip`,否则需要先完成这些工具的安装。 - 登录时需确保网络连接正常,以便 CLI 工具与 LeetCode 服务器通信。 - 如遇到插件兼容性问题,可以查阅 `leetcode-cli-plugins` 的文档,或调整 `.lcconfig` 文件中的插件配置[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值