数据结构学习 jz67 把字符串转换成整数

关键词:字符串 溢出处理

题目:把字符串转换成整数 (atoi)

这道题要充分了解需求(测试用例)才能顺利做完。

方法一:[ 用时: 34 m 26 s ] 基于测试用例的程序设计 调试了很久 总之就是分类讨论就可以了,为了防止溢出我用了long。

方法二:似乎是不能用long,所以看了题解,学会了如何处理溢出。

 

方法一:

思路:

就是分类讨论。

这里我用了long long

long long res=0;//要long或者long long不然会溢出

a是判断这个数是正数还是负数,默认为正数,1。

 isnum是判断前面的数是否为有效数字。

直接看代码注释吧。

复杂度计算:

时间复杂度O(n)

空间复杂度O(1)

代码:

class Solution {
public:
    int myAtoi(string str) {
        long long res=0;//要long或者long long不然会溢出
        int a =1;//记录正负
        bool isnum=false;//记录前面是否有有效数字
        for(int i=0;i<str.size();i++)
        {
            if(!isnum) //如果前面没有有效数字
            {
                if(str[i]==' ')//是空格,跳过
                {
                    continue;
                }else if(str[i]=='-')//是负号,说明有有效数字
                {
                    isnum=true;//有有效数字
                    a=-1;//改变a的符号
                    continue;
                }else if(str[i]=='+')//是正号,说明有有效数字
                {
                    isnum=true;
                    continue;
                }
                else if(str[i]>='0'&&str[i]<='9')//是数字,这里因为前面没有正负号所以默认正好,a==1
                {
                    isnum=true;
                    res+=str[i]-'0';//注意是从符号装顺序
                }
                else//啥都不是返回空
                {
                    return res;
                }
            }
            else//如果前面有有效数字
            {
                if(str[i]>='0'&&str[i]<='9')//继续接数字
                {
                    res=(str[i]-'0')+res*10;//因为是从高位读到低位,所以乘10(左移)
                    if(res*a>INT_MAX) return INT_MAX;//如果溢出,直接返回
                    if(res*a<INT_MIN) return INT_MIN;
                }
                else//如果是非数字,那么返回结果,别忘了符号
                {
                    return res*a;
                }
            }
        }
        return res*a;
    }
};

方法二:

和方法一相比,改了对溢出的处理,没用long。

思路:

越界处理(有用,值得学习):

这里我是看了k神的答案:

总之就是,在越界之前防患于未然

int bndry=INT_MAX/10;
    if(res>bndry||(res==bndry&&str[i]-'0'>7))
        return a==1?INT_MAX:INT_MIN;

复杂度计算:

时间复杂度O(n)

空间复杂度O(1)

代码:

class Solution {
public:
    int myAtoi(string str) {
        int res=0;
        int bndry=INT_MAX/10;
        int a =1;
        bool isnum=false;
        for(int i=0;i<str.size();i++)
        {
            if(!isnum) 
            {
                if(str[i]==' ')
                {
                    continue;
                }else if(str[i]=='-')
                {
                    isnum=true;
                    a=-1;
                    continue;
                }else if(str[i]=='+')
                {
                    isnum=true;
                    continue;
                }
                else if(str[i]>='0'&&str[i]<='9')
                {
                    isnum=true;
                    res+=str[i]-'0';
                }
                else
                {
                    return res;
                }
            }
            else
            {
                if(str[i]>='0'&&str[i]<='9')
                {
                    if(res>bndry||(res==bndry&&str[i]-'0'>7))
                        return a==1?INT_MAX:INT_MIN;
                    res=(str[i]-'0')+res*10;
                }
                else
                {
                    return res*a;
                }
            }
        }
        return res*a;
    }
};

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将十进制数转换成字符串的过程需要用到除法和取模运算,这在汇编语言中可以通过使用指令实现。 下面是一个将十进制数转换成字符串的汇编语言程序示例: ``` ; 将十进制数转换成字符串,存储在 buf 中 ; 参数: ; edx = 十进制数 ; ecx = buf 地址 ; 返回值: ; eax = 转换后字符串的长度 section .data digits db "0123456789" section .text global dec_to_str dec_to_str: push ebp mov ebp, esp push ebx push esi push edi mov ebx, ecx ; ebx = buf 地址 mov edi, ebx ; edi = 字符串指针 mov esi, edx ; esi = 十进制数 xor eax, eax ; eax = 0 cmp esi, 0 jge .loop_start ; 如果是正数则直接跳转到循环开始 mov byte [edi], '-' inc edi neg esi ; 取绝对值 inc eax .loop_start: cmp esi, 0 jz .loop_end ; 如果已经处理完了则跳转到结束 xor edx, edx div dword 10 ; edx = 余数,eax = 商 mov dl, byte [digits + eax] ; 将数字转换成字符 mov byte [edi], dl ; 存储字符 inc edi inc eax ; 字符串长度加一 jmp .loop_start .loop_end: mov byte [edi], 0 ; 字符串末尾添加 NULL 结束符 sub edi, ebx ; 计算字符串长度 mov eax, edi pop edi pop esi pop ebx mov esp, ebp pop ebp ret ``` 该程序使用了除法指令 `div` 和取模指令 `mod` 来实现将十进制数转换成字符串的过程。具体来说,程序将十进制数不断地除以 10,将商转换成字符并存储到字符串中,直到商为 0。同时,程序还需要处理负数的情况,将负数转换成绝对值后,在字符串前添加负号。最后,程序需要加上 NULL 结束符,并计算字符串的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值