标签:字符 false Offer 小数点 整数 isNum str 字符串 20
思路:
就是各自if/else if语句判断各个情况
代码:
class Solution {
public boolean isNumber(String s) {
if(s==null||s.length()==0){
return false;
}
//标记是否遇到数位、小数点、e或E
boolean isNum=false,isDot=false,ise_or_E=false;
//把s变为字符数组,trim()表示删除空格
char[] str=s.trim().toCharArray();
for(int i=0;i<str.length;i++){
if(str[i]>='0'&&str[i]<='9'){
isNum=true;
}
else if(str[i]=='.'){
//小数点之前可以没有整数
//但是不能出现重复的小数点
//小数点之前也不能有e/E
if(isDot||ise_or_E){
return false;
}
isDot=true;
}
else if(str[i]=='e'||str[i]=='E'){
//e或E前面必须有整数,且前面不能出现重复的e/E
if(!isNum||ise_or_E){
return false;
}
//标记e/E已遇到
ise_or_E=true;
//重置整数,因为e/E之后也要有整数
isNum=false;
}
else if(str[i]=='-'||str[i]=='+'){
//正负号只能出现在第一个位置、e或E的后面
if(i!=0&&str[i-1]!='e'&&str[i-1]!='E'){
return false;
}
}
else{
//其他的情况都是不合法字符
return false;
}
}
return isNum;
}
}
分解:
1)当前字符是整数(str[i]>='0'&&str[i]<='9')
就置isNum=true,表示已遇到整数
2)当前字符是小数点'.'
小数点之前不能出现小数点,也不能出现e/E。如果出现就直接返回false
并且置小数点已经遇到过isDot=true
3)当前字符是e/E
e/E之前必须有整数,不能出现重复的e/E。如果出现就直接返回false
并且置e/E已经遇到ise_or_E=true,重置整数没有遇到isNum=false,因为e/E之后也要有整数
4)当前字符是正负号+/-
正负号只能出现在第一个位置或者是e/E的后面。如果都不是则返回false
5)其他的情况都是不合法字符,直接返回false
6)如果循环结束之后仍然没有返回,说明一整个都是整数,返回isNum
复杂度分析:
时间复杂度:O(N) 所有字符都要遍历一次
空间复杂度:O(N) 利用了一个字符数组
标签:字符,false,Offer,小数点,整数,isNum,str,字符串,20 来源: https://blog.csdn.net/di_ko/article/details/116081936
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。