美文网首页
每天进步一点点【2019.8.22】

每天进步一点点【2019.8.22】

作者: 天使的流浪 | 来源:发表于2019-08-22 10:50 被阅读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.

    相关文章

      网友评论

          本文标题:每天进步一点点【2019.8.22】

          本文链接:https://www.haomeiwen.com/subject/xcogsctx.html