【算法day9】字符串转换整数 (atoi);请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

  1. 字符串转换整数 (atoi)

https://leetcode.cn/problems/string-to-integer-atoi/description/

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

空格:读入字符串并丢弃无用的前导空格(" ")
符号:检查下一个字符(假设还未到字符末尾)为 ‘-’ 还是 ‘+’。如果两者都不存在,则假定结果为正。
转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。

返回整数作为最终结果。

在这里插入图片描述

class Solution {
public:
    int myAtoi(string s) {
        int s_len = s.size();
        int cur_idx = 0;
        int sf = 1; // 符号
        while (cur_idx < s_len) {
            if (s[cur_idx] == ' ') {
                cur_idx++;
            } else {
                break;
            }
        }
        if (s[cur_idx] == '+') {
            sf = 1;
        } else if (s[cur_idx] == '-') {
            sf = -1;
        } else {
            cur_idx--;
        }
        cur_idx++;
        while (cur_idx < s_len) {
            if (s[cur_idx] == '0') {
                cur_idx++;
            } else {
                break;
            }
        }
        long long num = 0;
        int MAX_INT_LENGTH = 12;
        int start_idx = cur_idx;
        while (cur_idx < s_len && cur_idx - start_idx < MAX_INT_LENGTH) {
            if (s[cur_idx] >= '0' && s[cur_idx] <= '9') {
                num = num * 10 + s[cur_idx] - '0';
                cur_idx++;
            } else {
                break;
            }
        }
        num = num * sf;
        int MAX_INT = 0x7FFFFFFF;
        int MIN_INT = MAX_INT * -1 - 1;
        if (num >= MAX_INT) {
            return MAX_INT;
        } else if (num <= MIN_INT) {
            return MIN_INT;
        }

        int ans = num;
        return ans;
    }
};
### 使用 C 语言实现字符串转换为两有符号整数的 `myAtoi` 函数 下面是基于 C 语言编写的 `myAtoi` 函数,其功能是从给定的字符串中解析出一个最多两有符号整数。代码实现了去除前导空格、判断正负号、提取数字以及裁剪至两的功能。 ```c #include <stdio.h> #include <ctype.h> #include <limits.h> int myAtoi(const char* str) { int i = 0; int sign = 1; // 默认为正数 long result = 0; // 去掉前导空格 while (str[i] == &#39; &#39;) { i++; } // 判断正负号 if (str[i] == &#39;+&#39; || str[i] == &#39;-&#39;) { sign = (str[i] == &#39;-&#39;) ? -1 : 1; i++; } // 提取数字部分 while (str[i] >= &#39;0&#39; && str[i] <= &#39;9&#39;) { result = result * 10 + (str[i] - &#39;0&#39;); // 防止溢出 if (result > INT_MAX / 10) { break; } i++; } // 应用符号 result *= sign; // 截断到两 if (result > 99) { return 99; } else if (result < -99) { return -99; } else { // 转换为两数 char buffer[8]; snprintf(buffer, sizeof(buffer), "%d", (int)result); if (strlen(buffer) > 2) { return (sign > 0) ? atoi(buffer + strlen(buffer) - 2) : -atoi(buffer + strlen(buffer) - 2); } else { return (int)result; } } } // 测试函数 void testMyAtoi() { const char* tests[] = {"42", " -42", "4193 with words", "words and 987", "-91283472332"}; int expectedResults[] = {42, -42, 41, 0, -99}; for (size_t i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) { printf("Test %zu: Input=\"%s\", Output=%d\n", i+1, tests[i], myAtoi(tests[i])); } } ``` --- #### 功能说明 - **去除非数字字符**:通过循环跳过所有前导空格,并检查首个非空格字符是否为合法的正负号[^1]。 - **提取数字序列**:逐一遍历字符串中的连续数字字符,将其累积到结果变量中[^2]。 - **边界控制**:当累计值接近或超过两数的最大表示范围时停止进一步处理[^3]。 - **应用符号与截断**:依据之前记录下的符号标记调最终数值方向;对于超出两长度的情况仅保留最右侧两个有效[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值