leetcode 65. Valid Number
2016-04-16 11:58
302 查看
Validate if a given string is numeric.
Some examples:
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
这题虽没啥难的但要考虑的情况太多,太琐碎,所以提交了很多次,最后几乎是提交一次按错误的情况修改代码,简直要崩溃。所以建议事先收集好所有信息,在vs编辑器里定义一个数字,然后看是不是valid,这样可以避免很多错误提交。
最后写代码要耐心。
bool isNumber(char* s) {
//double c = 5e-5;
//int p = +-+-0.;
//double c = 3.e1;
//double cc = -+-+1.3e4;
//double v = 1.4+1e2;
if (s == NULL)
return false;
int len = strlen(s);
if (s[0] != '.'&&s[0] != ' '&&s[0] != '+'
&&s[0] != '-' && !(s[0] - '0' >= 0 && s[0] - '9' <= 0))
return false;
int k = 0;
while (k < len&&s[k] == ' ')
k++;
if (k == len)
return false;
int jj=k;
if (s[k] == '+' || s[k] == '-')
{
jj = k;
while (jj < len&&s[jj] == '+' || s[jj] == '-')
jj++;
if (jj == len)
return false;
for (int i = k; i < jj - 1; i++)
if (s[i] == s[i + 1])
return false;
k = jj;
}
int uu = len - 1;
while (uu >= 0 && s[uu] == ' ')
uu--;
for (int iii = k; iii <= uu; iii++)
if (s[iii] == ' ')
return false;
int dotpos = -1;
if (s[k] == '.')
{
int yy = k + 1;
while (yy < len&&s[yy] == ' ')
yy++;
if (yy == len)
return false;
dotpos = k;
for (int i = k + 1; i < len; i++)
if (s[i] == '.')
return false;
}
else
{
for (int i = k + 1; i < len; i++)
if (s[i] == '.')
{
if (dotpos >= 0)
return false;
dotpos = i;
}
}
if (dotpos >= 0)
{
if (dotpos == len - 1)
{
if (!(len-2>=0&&(s[len-2] - '0' >= 0 && s[len-2] - '9' <= 0)))
return false;
for (int i = jj; i < len - 1; i++)
if (s[i] == 'e'||s[i]=='+'||s[i]=='-')
return false;
return true;
}
for (int i = k; i < dotpos; i++)
if (!(s[i] - '0' >= 0 && s[i] - '9' <= 0))
return false;
int ii;
for (ii = dotpos + 1; ii < len; ii++)
if (s[ii] != ' ')
break;
if (ii == len)
return true;
k = dotpos + 1;
}
if (k == len)
return false;
if (!(s[k] - '0' >= 0 && s[k] - '9' <= 0||s[k]=='e'))
return false;
while (k < len && (s[k] - '0' >= 0 && s[k] - '9' <= 0))
k++;
if (k == len)
return true;
int j;
for (j = k; j < len; j++)
if (s[j] != ' ')
break;
if (j == len)
return true;
if (s[k] != 'e')
return false;
if (k - 1 >= 0 && s[k - 1] == '.')
{
if (!(k - 2 >= 0 && s[k - 2] - '0' >= 0 && s[k - 2] - '0' <= 9))
return false;
}
bool fl = false;
for (int i = 0; i < k; i++)
if (s[i] - '0' >= 0 && s[i] - '0' <= 9)
{
fl = true;
break;
}
if (!fl)
return false;
if (k == len - 1)
return false;
k++;
if (s[k] == '+' || s[k] == '-')
k++;
if (k == len)
return false;
if (!(s[k] - '0' >= 0 && s[k] - '9' <= 0))
return false;
int i;
for (i = k; i < len; i++)
if (!(s[i] - '0' >= 0 && s[i] - '9' <= 0))
break;
if (i == len)
return true;
for (; i < len; i++)
if (s[i] != ' ')
return false;
return true;
}
Some examples:
"0"=>
true
" 0.1 "=>
true
"abc"=>
false
"1 a"=>
false
"2e10"=>
true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
这题虽没啥难的但要考虑的情况太多,太琐碎,所以提交了很多次,最后几乎是提交一次按错误的情况修改代码,简直要崩溃。所以建议事先收集好所有信息,在vs编辑器里定义一个数字,然后看是不是valid,这样可以避免很多错误提交。
最后写代码要耐心。
bool isNumber(char* s) {
//double c = 5e-5;
//int p = +-+-0.;
//double c = 3.e1;
//double cc = -+-+1.3e4;
//double v = 1.4+1e2;
if (s == NULL)
return false;
int len = strlen(s);
if (s[0] != '.'&&s[0] != ' '&&s[0] != '+'
&&s[0] != '-' && !(s[0] - '0' >= 0 && s[0] - '9' <= 0))
return false;
int k = 0;
while (k < len&&s[k] == ' ')
k++;
if (k == len)
return false;
int jj=k;
if (s[k] == '+' || s[k] == '-')
{
jj = k;
while (jj < len&&s[jj] == '+' || s[jj] == '-')
jj++;
if (jj == len)
return false;
for (int i = k; i < jj - 1; i++)
if (s[i] == s[i + 1])
return false;
k = jj;
}
int uu = len - 1;
while (uu >= 0 && s[uu] == ' ')
uu--;
for (int iii = k; iii <= uu; iii++)
if (s[iii] == ' ')
return false;
int dotpos = -1;
if (s[k] == '.')
{
int yy = k + 1;
while (yy < len&&s[yy] == ' ')
yy++;
if (yy == len)
return false;
dotpos = k;
for (int i = k + 1; i < len; i++)
if (s[i] == '.')
return false;
}
else
{
for (int i = k + 1; i < len; i++)
if (s[i] == '.')
{
if (dotpos >= 0)
return false;
dotpos = i;
}
}
if (dotpos >= 0)
{
if (dotpos == len - 1)
{
if (!(len-2>=0&&(s[len-2] - '0' >= 0 && s[len-2] - '9' <= 0)))
return false;
for (int i = jj; i < len - 1; i++)
if (s[i] == 'e'||s[i]=='+'||s[i]=='-')
return false;
return true;
}
for (int i = k; i < dotpos; i++)
if (!(s[i] - '0' >= 0 && s[i] - '9' <= 0))
return false;
int ii;
for (ii = dotpos + 1; ii < len; ii++)
if (s[ii] != ' ')
break;
if (ii == len)
return true;
k = dotpos + 1;
}
if (k == len)
return false;
if (!(s[k] - '0' >= 0 && s[k] - '9' <= 0||s[k]=='e'))
return false;
while (k < len && (s[k] - '0' >= 0 && s[k] - '9' <= 0))
k++;
if (k == len)
return true;
int j;
for (j = k; j < len; j++)
if (s[j] != ' ')
break;
if (j == len)
return true;
if (s[k] != 'e')
return false;
if (k - 1 >= 0 && s[k - 1] == '.')
{
if (!(k - 2 >= 0 && s[k - 2] - '0' >= 0 && s[k - 2] - '0' <= 9))
return false;
}
bool fl = false;
for (int i = 0; i < k; i++)
if (s[i] - '0' >= 0 && s[i] - '0' <= 9)
{
fl = true;
break;
}
if (!fl)
return false;
if (k == len - 1)
return false;
k++;
if (s[k] == '+' || s[k] == '-')
k++;
if (k == len)
return false;
if (!(s[k] - '0' >= 0 && s[k] - '9' <= 0))
return false;
int i;
for (i = k; i < len; i++)
if (!(s[i] - '0' >= 0 && s[i] - '9' <= 0))
break;
if (i == len)
return true;
for (; i < len; i++)
if (s[i] != ' ')
return false;
return true;
}
相关文章推荐
- rsync数据备份(二)--RHEL6.5
- 智能计算/计算智能、仿生算法、启发式算法的区别与关系?
- 解决Win10下Android Studio terminal无法输入的问题
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- ios多线程操作(十一)—— NSOperation的高级操作
- 一个Java音乐播放器
- CI 笔记2,(命令规范等)
- 人月神话阅读笔记01
- MySql中Blob与Text的区别
- 【Unity】6.2 在VS2015中调试 C# 脚本
- 使用ViewPager动画来做出不一样的引导页
- C++中如何重载<<
- 修改wordpress地址(URL)导致不能登录后台
- const和#define的区别
- 5.3 一致性
- 【GCJ2016】 round 1A
- ios多线程操作(十)—— 用NSOperation开启多线程操作
- Linux下git源码安装
- 匈牙利算法模板
- VS学习4——计算工资与扣税