• [LintCode]转换字符串到整数


    问题描述:

    实现atoi这个函数,将一个字符串转换为整数。如果没有合法的整数,返回0。如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-2147483648)如果是负整数。

    样例

    "10" =>10

    "-1" => -1

    "123123123123123" => 2147483647

    "1.0" => 1

    问题分析:

    这道题特别恶心,虽然思路很简单,但是它却表述不清。经过若干次失败的尝试,终于明白了它的含义。大概有以下几种注意情况:

    (一).""的话返回0。

    (二).字符串两边有空格自动屏蔽,有小数点小数点后面的内容舍弃。

    (三)."+123"和"123"效果一样。

    (四)."a...","-h..."这种,除了符号位只要非数字打头,返回0。

    (五)."123gdah3423","-123ff777"这种返回123,-123。

    (六).超了范围之后,判断正负性。

    问题求解:

    public class Solution {
        /**
         * @param str: A string
         * @return An integer
         */
           public int atoi(String str) {
            // 去除小数位和两边的空格,存在str1中
            String str1 = null;
            // 后面数字和非数字混合的情况,用于截取前面的数字
            StringBuilder sb = new StringBuilder();
            if (str.contains(".")) {
                str1 = str.substring(0, str.indexOf(".")).trim();
            } else {
                str1 = str.trim();
            }
            try {
                if ("".equals(str1)) {
                    return 0;
                }
                return Integer.parseInt(str1);
            } catch (NumberFormatException e) {
                /*
                 * 先进行判断,字符串前面是否有"+"和"-",分三种情况
                 */
                //1.前面既没有"+"也没有"-"
                if (str1.charAt(0) != '-' && str1.charAt(0) != '+') {
                    processData(0, str1, sb);
                    if (sb.length() == 0) {// 第一个是非数字
                        return 0;
                    } else if (sb.length() < str1.length()) {// 数字中夹杂非数字
                        return atoi(sb.toString());
                    } else {// 全是数字
                        return Integer.MAX_VALUE;
                    }
                //2.前面是"+"
                } else if (str1.charAt(0) == '+') {
                    processData(1, str1, sb);
                    if (sb.length() == 0) {// 第一个是非数字
                        return 0;
                    } else if (sb.length() < str1.length() - 1) {// 数字中夹杂非数字
                        return atoi(sb.toString());
                    } else {// 全是数字
                        return Integer.MAX_VALUE;
                    }
                //3.前面是"-"
                } else {
                    sb.append('-');
                    processData(1, str1, sb);
                    if (sb.length() == 1) {// 第一个是非数字
                        return 0;
                    } else if (sb.length() < str1.length()) {// 数字中夹杂非数字
                        return atoi(sb.toString());
                    } else {// 全是数字
                        return Integer.MIN_VALUE;
                    }
                }
            }
        }
    
        public void processData(int start, String str1, StringBuilder sb) {
            for (int i = start; i < str1.length(); i++) {
                if (str1.charAt(i) < '0' || str1.charAt(i) > '9') {
                    break;
                }
                sb.append(str1.charAt(i));
            }
        }
    
    }
  • 相关阅读:
    html的基本框架和常用标签
    防火墙
    Zenmap
    每日一招:熟练掌握变盘方向
    每日一招:赚钱最快的选股策略
    操盘策略:黄金做单时间
    每日一招:坚守六大方式选出优质股
    如何保卫你的牛市胜利果实?
    名家看后市:长阴破位不必慌
    每日一招:补仓需遵守的技巧
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/5731270.html
Copyright © 2020-2023  润新知