剑指 Offer 20. 表示数值的字符串(中等)

2021/4/24 10:26:41

本文主要是介绍剑指 Offer 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) 利用了一个字符数组



这篇关于剑指 Offer 20. 表示数值的字符串(中等)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程