每天进步一点点【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.