每天进步一点点【2019.8.22】

2019-08-22  本文已影响0人  天使的流浪

一、字符串转换整数(atoi)【leetcode 8】

题目描述:请你来实现一个 atoi 函数,使其能将字符串转换成整数
要求

1) 该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
2) 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
3) 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
4)  假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换
5) 在任何情况下,若函数不能进行有效的转换时,请返回 0。
6) 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [INT_MIN,  INT_MAX]

输入
"-91283472332"
输出
-2147483648
分析

针对迭代中的字符做出判断,给出不同的处理方案【难点在于越界处理】;
1)首位出现正负数,不进行处理;
2)任何位出现数字,添加到Stringbuffer
3)如果出现其他字符,之间添加"0"
4)  判断是否越界 < 字符串超出int边界>

代码:

public static int myAtoi(String str) {
        StringBuffer sb = new StringBuffer();
        // 1.去空格
        char [] chars = str.trim().toCharArray();
        if(chars.length==0) return 0;
        boolean flag = true;  // 标记正负数
        flag = chars[0]=='-'?false:true;
        for (int i = 0; i < chars.length; i++) {
            // 首字母为正负号
            if(i==0&&((chars[i]=='-')||(chars[i]=='+')))continue;
            // // 2.正、负、整数
            if((chars[i]>='0')&&(chars[i]<='9')){
                sb.append(chars[i]);
                continue;
            }
            // 4.字母开头-》0
            // 3.整数之后字符忽略
            if(i==0) sb.append('0');
            if(i!=0&&((chars[i]=='+')||(chars[i]=='-'))&&(sb.toString().length()==0)) sb.append('0');
            break;
        }
        String strs = sb.toString();
        if(strs.length()==0) return 0;
        // 5.是否越界
        boolean out = isOut(strs,flag);
        if(out){
            return flag?Integer.MAX_VALUE:Integer.MIN_VALUE;
        }else {
            return flag?Integer.parseInt(strs):-Integer.parseInt(strs);
        }
    }
    // 字符串是否越界(大于整型的范围)
    public static boolean isOut(String str, boolean flag2){
        int index = 0;
        long data = 0;
        boolean flag = true;
        while (index<str.length()) {
            data = data*10+Integer.parseInt(str.charAt(index)+"");
            index++;
            if(flag2 && data>=Integer.MAX_VALUE){
                flag = false;
            }
            if(!flag2 && -data<=Integer.MIN_VALUE){
                flag = false;
            }
        }
        return flag?false:true;
    }

存在问题

1)循环中对于非数字的处理逻辑比较乱;
2)对于数字是否越界问题:字符串的实现方案比数字更加复杂,难操作;

改进思路:优化循环处理逻辑和越界判断
实现

public static int myAtoi1(String str) {
         // 异常结果判断
         char chars [] = str.trim().toCharArray();
         if(chars.length==0 || (chars[0]<'0' ||  chars[0]>'9')&&chars[0]!='+'&& chars[0]!='-') return  0;
         int flag = 1;
         int result = 0;
         for (int i = 0; i < chars.length; i++) {
             // 减号
             if(chars[i]=='-' && i==0){
                 flag= -1;
                 continue;
             }
             // 加号
             if(chars[i]=='+' && i==0) continue;
             // 非数字
             if(chars[i]<'0' || chars[i]>'9') break;
             // 越界
             if(result*flag>Integer.MAX_VALUE/10  ||(result*flag==Integer.MAX_VALUE/10 &&
                      (chars[i]-'0')*flag>Integer.MAX_VALUE%10)) return  Integer.MAX_VALUE;
             if(result*flag<Integer.MIN_VALUE/10  ||(result*flag==Integer.MIN_VALUE/10 &&
                      (chars[i]-'0')*flag<Integer.MIN_VALUE%10)) return  Integer.MIN_VALUE;
             result = result*10+chars[i]-'0';
         }
         return result*flag;
    }

二、每日一点心理学

安泰效应
典故:古希腊神话中的大力神,他力大无穷,无往不胜。因为他只要靠在大地上,就能从大地母亲那里汲取无穷的力量。他的对手发现了这个秘密,便诱使他离开地面,在空中杀死了他;
启发:要学会依靠大家、依靠集体;

三、每日一句
If you focus on results, you will never change. If you focus on change, you will get results.

上一篇下一篇

猜你喜欢

热点阅读