zoukankan      html  css  js  c++  java
  • 字符串转换整数(atoi)

    请你来实现一个 atoi 函数,使其能将字符串转换成整数。

    首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

    当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

    该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

    注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

    在任何情况下,若函数不能进行有效的转换时,请返回 0。

    说明:

    假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

    示例 1:

    输入: "42"
    输出: 42

    示例 2:

    输入: "   -42"
    输出: -42
    解释: 第一个非空白字符为 '-', 它是一个负号。
         我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

    示例 3:

    输入: "4193 with words"
    输出: 4193
    解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

    示例 4:

    输入: "words and 987"
    输出: 0
    解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
         因此无法执行有效的转换。

    示例 5:

    输入: "-91283472332"
    输出: -2147483648
    解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
         因此返回 INT_MIN (−231) 。

    解题思路:

      1)针对该题的解题思路其实很简单,第一就是对传入的字符串ltrim,左trim,去掉字符串左侧的空格,然后判断,剩下的字符是否为空如果为空了,那直接就返回0;

      2)接着判断字符串的首字符,字符串的首字符有三种情况,第一种就是,直接上来就是数字,那直接读取每一位字符,变换为数字,然后在变换的过程中,要与INT_MAX进行比较,如果发现超出,则返回INT_MAX; 第二种情况是首字符是+,接着需要判断第二个字符是否是数字,如果不是,就直接返回,如果是的话,就接着读取字符处理;第三种情况是首字符是-, 接着判断第二个字符是否是数字,如果不是,就直接返回,如果是的话,就接着读取字符处理。

      3)不管是正数还是负数,都需要判断有符号INT型的最大值与最小值是否越界的问题。

    代码实现如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define INT_MIN  -2147483648
    #define INT_MAX  2147483647
     

    char *ltrim(char *string)
    {
         int ii,kk,ll;
         ll=strlen(string);
         kk=0;
         for(ii=0;ii<ll;ii++)
         {
             if(string[ii]==' ') kk++;
             else break;
         }
         if(kk==0return string;
         for(ii=kk;ii<ll;ii++)
         {
             string[ii-kk]=string[ii];
         }
         string[ll-kk]=0;
         return string;
    }

    int myAtoi(char *str){
        int ret=0;  
        char * new_s=NULL;
        new_s=ltrim(str);
        if(!new_s){
            goto end;
        }
        char * valid_nums="0123456789";
        char * valid_symbol="+-";
        int flag=1;// 1:positive, 0:negative
    retry:
        if(strchr(valid_nums, new_s[0])){
            int num=0;
            int convert_num=0;
            while(*new_s!='0' && strchr(valid_nums, *new_s)){
                if(flag ==1){
                    num=*new_s-'0';
                    if(convert_num > INT_MAX / 10 || (convert_num == INT_MAX / 10 && num >7)){
                                ret=INT_MAX;
                                goto end;
                     }
                }else{
                    num='0'-*new_s;
                    if(convert_num < INT_MIN / 10 || (convert_num == INT_MIN / 10 && num < -8)){
                                ret=INT_MIN;
                                goto end;
                     }

                }
                convert_num=convert_num*10+num;
                new_s++;
            }
            ret=convert_num;
            goto end;
            
        }else if (strchr(valid_symbol, new_s[0])){
       
         if(new_s[0]=='+' && strchr(valid_nums, new_s[1])){
                new_s++;
                goto retry;
            }else if(new_s[0]=='-'&& strchr(valid_nums, new_s[1])){
                flag=0;
                new_s++;
                goto retry;
            }else{
                goto end;
            }      
        }else{
            goto end;
        }

    end:
        return ret;

    }

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/string-to-integer-atoi

    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    linux指令大全
    strcpy.strcmp.strlen.strcat函数的实现
    推箱子
    头文件string.h里的函数
    SVN 版本控制工具
    Nodejs 学习
    JavaScript基础知识复习
    CSS3 学习小结
    JSP中 JSTL
    JSP中的EL语言
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12416515.html
Copyright © 2011-2022 走看看