今天的两道题都是字符串转数字相关的,好麻烦,条件总是考虑不全
思路:主要是条件要考虑全
'.'出现的正确情况:只出现一次,且'.'出现的时候e还没出现
‘e’出现的正确情况:只出现一次,且e出现前要有数字出现
'+/-'出现的正确情况:只能在开头,或者紧接着e出现
注意:代码最后return numFlag。首先不管哪种情况,都需要有数字出现,没有数字肯定不对;其次对于出现e的情况,接收到e时,前面必定已有数字出现,此时将numFlag重置,意味着接收到e后,如果后面没有数字,也是错误结果。(必须以num结尾)
public boolean isNumber(String s) {
if (s == null || s.length()==0)
return false;
s = s.trim();//去掉空格
boolean numFlag = false;//是否出现数字
boolean dotFlag = false;//是否出现点
boolean eFlag = false; //是否出现e
for (int i=0;i<s.length();i++){
// 出现数字
if (s.charAt(i)>='0' && s.charAt(i)<='9'){
numFlag = true;
}else if (s.charAt(i)=='.' && !dotFlag && !eFlag){
// 出现. 要求此前没出现过. 和 e
dotFlag = true;
}else if ((s.charAt(i)=='e' || s.charAt(i) == 'E') && !eFlag && numFlag){
// 出现e,需要此前没出现过e 并且出现过数字
eFlag = true;
numFlag = false; // 为了避免123e这种情况,出现e后的标志为false
}else if ((s.charAt(i)=='+' || s.charAt(i)=='-') && (i == 0 || s.charAt(i-1)=='e' || s.charAt(i-1)=='E')){
//出现+/-
}else{
// 其他情况都非法
return false;
}
}
return numFlag;
}
思路:也是想好所有情况。如果以“+/-”开头,注意要对结果加上正负符号,且要注意计算过程中的越界问题;如果以数字开头,直接计算结果就行;如果其他字符开头,直接返回0。
public int strToInt(String str) {
str = str.trim();
if (str == null || str.length() == 0)
return 0;
boolean isMinus = false;//记录是否是负数
char[] ch = str.toCharArray();
if (ch[0]=='+' || ch[0]=='-' ||Character.isDigit(ch[0])){
// 是否正负号开头
if (ch[0] == '+' || ch[0]=='-'){
if (ch[0] == '-'){
isMinus = true;
}
// 删除首位
ch = Arrays.copyOfRange(ch,1,ch.length);
}
int index = 0;
long res = 0;//注意结果用long型存储
while (index<ch.length && Character.isDigit(ch[index])){
res = res*10+(ch[index]-'0');
if (res > Integer.MAX_VALUE){
return isMinus?Integer.MIN_VALUE:Integer.MAX_VALUE;//正或负
}
index++;
}
return isMinus?-(int)res:(int)res;
}
// 不是数字或+-开头
return 0;
}