zoukankan      html  css  js  c++  java
  • 剑指Offer解题报告(Java版)——字符串转换为数字 49

       

    引言

       

    STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界

       

    分析问题

       

    如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数

       

    然后就是字符串中有可能第一个位置上有符号,比如负号,对于正数,有可能有,有可能没有,这种问题应该怎么去解决呢,其实如果有符号的话也肯定是在第一个字符处,所以我们只要判断一下第一个字符是不是负号,如果是,我们需要勇哥标志标记一下,如果不是负号而是正号,那么直接跳过就行,如果没有符号,那么从第一个数开始读取

       

    另外就是有可能前面的字符串都是乖乖的是数字,中间来个异常字符,那么我们这个时候需要做的就要分情况了,第一我们可以保留前面的数字,舍弃异常字符后面的东西,第二就是我们直接简单粗暴的返回错误

       

    还有就是字符串表示的数字有可能很大,有可能越界,那么我们应该怎么办,可以输出,越界了,也可以返回最接近的整数

       

    另外用个boolean值表示是否正常完成,而对于一些异常的处理,可以因人而异,因要求而异了

       

    解决问题

       

    static boolean finished = false;

    public int atoi(String str) {

    str=str.trim();

    int i = 0;

    boolean minus = false;

    if (str.charAt(0) == '-') {

    minus = true;

    i++;

    } else if (str.charAt(0) == '+') {

    i++;

    }

    long MIN_VALUE = Integer.MIN_VALUE;

    long MAX_VALUE = Integer.MAX_VALUE;

    long num = 0;

       

    for (; i < length && !finished; i++) {

    char c = str.charAt(i);

    if (c >= '0' && c <= '9') {

    num *= 10;

    num += c - '0';

    } else {

    num=0;

    break;

    }

       

    if (minus && 0 - num < MIN_VALUE) {

    return Integer.MIN_VALUE;

    }

    if (!minus && num > MAX_VALUE) {

    return Integer.MAX_VALUE;

    }

    }

    if (i==length) {

    finished = true;

    }

    return minus ? new Long(0 - num).intValue() : new Long(num).intValue();

    }

  • 相关阅读:
    hdu 3068 Manacher算法
    用gitolite新建项目,clone后首次push,可能会出现: git: No refs in common and none specified; doing no
    Linux命令之nano
    linux下git使用记录1 git 提交
    Linux 删除文件夹和文件的命令
    UBUNTU 下GIT的安装
    mysql 常用命令
    mysql 数据类型
    SQL优化
    CSS入门教程——定位(positon)
  • 原文地址:https://www.cnblogs.com/keedor/p/4475346.html
Copyright © 2011-2022 走看看