距离上一次独立做出困难题已经好长时间了。。。今天虽然做出来了,但是是通过不断试错做出来的,自己考虑问题还是不够全面,以后还要加油,代码比较复杂,但思路很简单,有时间再优化以下吧。
65有效数字
不断的试错,不断的发现自己没考虑全面的地方。。。
思路
只需要注意以下各点,即可模拟检测过程:
- 字符串内只能存在以下字符
+
、-
、.
、数字0-9
、e
、E
; - 字符
.
、e或E
最多只能出现一次(最开始我只分析出.
最多只能出现一次,没理解题意e或E
也是最多只能出现一次,白给一次。。); - 字符串中至少包含一个
数字0-9
; - 在满足上述条件的前提下,字符串的第一个字符不能是
e或E
; - 在满足上述条件的前提下,字符串的最后一个字符只能是
.
或数字0-9
(如9.
是合法的,最开始没注意到,又白给一次。。); - 因为最多只能出现一次
e或E
,所以在存在e或E
时,e或E
左边必须包含数字0-9
,且e或E
的右侧只能是整数(也就是说不能再出现.
); - 一些需要注意的点:
+
、-
后面只能是.
或数字0-9
;.
后面只能是e或E
或数字0-9
;数字0-9
后面只能是e或E
或数字0-9
或.
;e或E
后面只能是+
或-
或数字0-9
或.
;
算法步骤:
- 检查字符串内是否存在非法字符,存在则返回false;
- 检查字符串中的
.
、数字0-9
、e或E
的数量,不满足上述条件则返回false; - 开始对字符串进行遍历,需要对以下情况进行判定:
- 存在
e或E
时,e或E
左边必须包含数字0-9
,且.
只能在e或E
的左边; +
、-
后面只能是.
或数字0-9
;.
后面只能是e或E
或数字0-9
;数字0-9
后面只能是e或E
或数字0-9
或.
;e或E
后面只能是+
或-
或数字0-9
或.
;
代码
class Solution {
public boolean isNumber(String s) {
//存储合法字符
Set<Character> set2 = new HashSet<>();
set2.add('+');
set2.add('-');
set2.add('.');
set2.add('e');
set2.add('E');
for (int i=0;i<=9;i++){
char c = (char) ('0' + i);
set2.add(c);
}
//检查是否存在非法字符、检查 ‘.’ 、‘数字0-9’、 ‘e或E’ 的数量
int dot = 0;
int eE = 0;
int digit = 0;
for (char i : s.toCharArray()){
if (!set2.contains(i))
return false;
if (i>='0' && i<='9')
digit++;
if (i=='e' || i=='E')
eE++;
if (i=='.')
dot++;
}
if (dot>1 || eE >1 || digit==0)
return false;
//检查开头的字符
if (s.charAt(0)=='e' || s.charAt(0)=='E')
return false;
//检查结尾
char ch1 = s.charAt(s.length()-1);
if (ch1=='+' || ch1=='-' || ch1=='e' || ch1=='E')
return false;
//开始遍历
//因为是从第二个开始遍历,先检查第一个字符的类型
dot=0;
if (s.charAt(0)=='.')
dot=1;
digit=0;
if (s.charAt(0) >='0' && s.charAt(0)<='9')
digit=1;
for (int i=1;i<s.length();i++)
{
if (s.charAt(i) >='0' && s.charAt(i)<='9')
digit=1;//标记e或E左边是否存在数字
if (s.charAt(i) == 'e' || s.charAt(i)=='E'){
dot = 1;//如果存在e或E,则其右侧不能出现‘.’
if (digit==0)//如果e或E左边不存在数字
return false;
}
//如果出现了‘.’检查其是否合法
if (s.charAt(i)=='.'){
if (dot!=0)
return false;
else
dot=1;
}
if (!checkNum(s,i))//检查是否满足8-11的要求
return false;
}
return true;
}
public boolean checkNum(String s, int index){
char b = s.charAt(index-1);
char c = s.charAt(index);
//一些判定规则
if (b=='+' || b=='-')
{
if (c=='+' || c=='-' || c=='e' || c=='E')
return false;
}
if (b=='.')
{
if (c=='+' || c=='-' || c=='.')
return false;
}
if (b>='0' && b<='9')
{
if (c=='+' || c=='-')
return false;
}
if (b=='e' || b=='E')
{
if (c=='e' || c=='E')
return false;
}
return true;
}
}