• LeetCode题解 #8 String to Integer (atoi)


    又是一道恶心的简单题。

    一开始没想到这么多情况的,幸好LeetCode是个很人性化的oj,能让你知道你在哪个case上错了,否则一辈子都过不了。

    考虑不周到只能一个个补了。

    列举一下恶心的case

    //" 010"
    //" +004500"
    //" -0012a42"
    //"2147483648"
    //" b11228552307"
    //"18446744073709551617"
    //" r11384376420"

    所有要注意的情况是:

    • 字符串前置的空格需要清除;//读掉所有空格
    • 无视前导0
    • 数字前最多允许1个"+"或"-",出现多个时返回0;
    • 数字中出现不为数字的符号时即认为数字结束,比如"252ab","252-2","252 09"都判定为252;//找到第一个非数字的地方
    • 数字大于INT_MAX时,返回INT_MAX,小于INT_MIN时,返回INT_MIN。

    其实没有考到什么算法,就是if else而已

    一开始的代码(觉得有必要贴出来,让以后的自己看看-_-)

    public static int myAtoi(String str) {

    long temp = 0;

    //空白
    if(str.length()==0)
    return 0;
    //非数字


    //单个数字
    else if(str.length()==1){
    //System.out.println((int)str.charAt(0)-48);

    if(48<=str.charAt(0)&&str.charAt(0)<=57)
    return (int)str.charAt(0)-48;
    else
    return 0;

    }

    //多个数字
    else{





    //读掉开头的空格
    int start = 0;
    for(start=0;start<str.length();start++)
    if(str.charAt(start)!=' ')
    break;

    if(start==str.length()){
    System.out.println("all blank");
    return 0;
    }




    //除开头外判断是否全是数字
    //找到非数字的地方

    int end = 0;

    for(end=start+1;end<str.length();end ++)
    if(!(48<=str.charAt(end)&&str.charAt(end)<=57)){

    System.out.println(str.charAt(start));
    System.out.println("not num");
    System.out.println("end-->"+end);
    break;


    }

    if(!(48<=str.charAt(start)&&str.charAt(start)<=57)&&!(48<=str.charAt(start+1)&&str.charAt(start+1)<=57)){

    System.out.println("not num");
    return 0;

    }


    if(str.charAt(start)=='+'){

    System.out.println(str.charAt(start));

    if(end-start>=13)
    return 2147483647;

    if(start+1==end-1)
    return ((int)str.charAt(start+1)-48);

    for(int i=start+1;i<end;i++){

    //System.out.println("temp--->"+temp);
    //System.out.println((int)str.charAt(i)-48);

    if(str.charAt(i)==' ')
    continue;

    temp = temp*10+((int)str.charAt(i)-48);

    //System.out.println("now --->"+temp);

    }

    //System.out.println(temp);
    System.out.println("zhengshu1");

    if(temp>=2147483647)
    return 2147483647;
    if(temp<=-2147483648)
    return 2147483647;

    return (int)temp;

    }

    else if(str.charAt(start)=='-'){

    if(start+1==end-1)
    return -((int)str.charAt(start+1)-48);

    if(end-start>=13)
    return -2147483648;

    for(int i=start+1;i<end;i++){

    //System.out.println("temp--->"+temp);
    //System.out.println((int)str.charAt(i)-48);

    if(str.charAt(i)==' ')
    continue;

    temp = temp*10+((int)str.charAt(i)-48);

    //System.out.println("now --->"+temp);

    }

    System.out.println(temp);

    temp = -temp;

    System.out.println("fushu");

    if(temp>=2147483647)
    return -2147483648;
    if(temp<=-2147483648){

    System.out.println("fushu min ");
    return -2147483648;
    }

    return (int)temp;




    }
    else{

    System.out.println(start-end);

    if(end-start>=13)
    return 2147483647;

    System.out.println(str.charAt(start));
    System.out.println(end);

    if(!(48<=str.charAt(start)&&str.charAt(start)<=57))
    return 0;

    if(start==end-1)
    return ((int)str.charAt(start)-48);



    for(int i=start;i<end;i++){

    //System.out.println("temp--->"+temp);
    //System.out.println((int)str.charAt(i)-48);

    if(str.charAt(i)==' ')
    continue;

    temp = temp*10+((int)str.charAt(i)-48);

    //System.out.println("now --->"+temp);

    }

    System.out.println(temp);
    System.out.println("zhengshu2");

    if(temp>=2147483647)
    return 2147483647;
    if(temp<=-2147483648)
    return 2147483647;

    return (int)temp;



    }

    }


    }

    以下是综合了所有情况但是高度简洁的代码:

    int myAtoi(string str) {

    int length = str.size();

    long long ret_64 = 0;

    int op = 1; int p = 0;

    while (str[p] == ' ') ++p;

    if (str[p] == '+' || str[p] == '-')

    { if (str[p] == '-') op = -1; p++; }

    for (int i = p; i < length; ++i)

     if ('0' <= str[i] && str[i] <= '9')

      { ret_64 = ret_64 * 10 + (str[i] - '0');

        if ((op == -1 && ret_64 > 2147483648LL))

           return -2147483648;

         if ((op == 1 && ret_64 > 2147483647LL))

           return 2147483647; }

         else

          break;

     return (int)ret_64 * op; }

    总结一下:

    没有技巧可言,就是常见的判断溢出(用long),一个个构建起一个数字(temp = temp*10+((int)str.charAt(i)-48);),字符转数字用ASCII码。

  • 相关阅读:
    jquery 实例
    jQuery总结或者锋利的jQuery笔记一
    前端 ajax 改写登录界面
    使用mybatisgenerator 辅助工具逆向工程
    一个ssm综合小案例-商品订单管理-第二天
    一个ssm综合小案例-商品订单管理-第一天
    一个ssm综合小案例-商品订单管理----写在前面
    delphi Ribbon 111
    Delphi Excel导入 的通用程序
    1. 微信公众号申请
  • 原文地址:https://www.cnblogs.com/wzben/p/5008617.html
Copyright © 2020-2023  润新知