(剑指Offer)面试题54:表示数值的字符串
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
表示数值的字符串遵循如下模式:
[sign]integral-digits[.[fractional-digit]][e|E[sign]exponential-digits]
说明一下:在数值之前可能有正负符号'+',‘-’,接下来是若干0-9的数位表示数值的整数部分(在某些小数里可能没有整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干0到9的数位表示数值的小数部分,如果数值用科学计数法表示,接下来是一个‘e’或‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
判断一个字符串是否满足上述模式,首先看第一个字符是否为正负符号,如果是在字符串往前移动一个字符,继续扫描字符串剩下中0-9的位数,如果是一个小数,则将遇到小数点,如果是科学计数法,在整数或者小数后面可能会遇到‘e’或‘E’.
代码:
#include <iostream>
#include <string.h> using namespace std; void scanDigits(char** string){
while(**string!='\0' && **string>='0' && **string<='9')
++(*string);
} bool isExponential(char** string){
if(**string!='e' && **string!='E')
return false; ++(*string);
if(**string=='+' || **string=='-')
++(*string);
if(**string=='\0')
return false; scanDigits(string);
return (**string=='\0')?true:false;
} bool isNumeric(char* string){
if(string==NULL)
return false; if(*string=='+' || *string=='-')
++string;
if(*string=='\0')
return false; bool numeric=true; scanDigits(&string); if(*string!='\0'){
if(*string=='.'){
++string;
scanDigits(&string);
if(*string=='e' || *string=='E')
numeric=isExponential(&string);
}
else if(*string=='e' || *string=='E')
numeric=isExponential(&string);
else
numeric=false;
} return numeric && *string=='\0';
} int main()
{
cout << isNumeric("5e2") << endl;
cout << isNumeric("12e") << endl;
cout << isNumeric("1a3.14") << endl;
cout << isNumeric("+-5") << endl;
return 0;
}
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/6f8c901d091949a5837e24bb82a731f2?rp=3
AC代码:
class Solution {
public:
bool isNumeric(char* string)
{
if(string==NULL)
return false;
int len=strlen(string);
int index=0;
if(string[index]=='+' || string[index]=='-')
++index;
if(index>=len)
return false;
bool numeric=true;
scanDigit(string,index);
if(index<len){
if(string[index]=='.'){
++index;
scanDigit(string,index);
if(index>=len)
numeric=true;
else if(string[index]=='e' || string[index]=='E')
numeric=isExponential(string,index);
else
numeric=false;
}
else if(string[index]=='e' || string[index]=='E')
numeric=isExponential(string,index);
else
numeric=false;
}
return numeric;
}
void scanDigit(char* string,int& index){
while(string[index]!='\0' && string[index]>='0' && string[index]<='9')
++index;
}
bool isExponential(char* string,int index){
if(string[index]!='e' && string[index]!='E')
return false;
++index;
if(string[index]=='+' || string[index]=='-')
++index;
if(string[index]=='\0')
return false;
scanDigit(string,index);
return (string[index]=='\0')?true:false;
}
};
(剑指Offer)面试题54:表示数值的字符串的更多相关文章
- 剑指offer——面试题16:数值的整数次方
// 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...
- 【剑指Offer】53、表示数值的字符串
题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100", "5e2", "-123",&q ...
- 剑指Offer面试题:10.数值的整数次方
一.题目:数值的整数次方 题目:实现函数double Power(doublebase, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 在.N ...
- 剑指offer(53)表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- 剑指offer五十三之表示数值的字符串
一.题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
随机推荐
- GenXus进行APP开发-全局颜色设计
我们每次开发APP时,会有不同的全局颜色设计(例如标准控件.状态栏.控件激活时等的默认颜色),那么我们在GeneXus中如何设置这些颜色呢?接下来就给大家介绍一下. 当我们通过GeneXus开发APP ...
- 洛谷——P1907 设计道路
P1907 设计道路 题目描述 Caesar远征高卢回来后,对你大加赞赏,他亲自来到Genoa视察. Genoa在你的建设下变得无比繁荣,由于财政收入的增加,你为城市修建了交通系统.古罗马的交通系统由 ...
- TCP/IP——IP网络协议简记
IP提供不可靠.无连接的数据报传送服务 不可靠:不保证IP数据报能成功到达目的地,当发生错误时,IP的做法是丢弃这个数据报,然后发送ICMP消息报给信息源. 无连接:IP不维护任何关于后续数据报的状态 ...
- python __str__ , __repr__区别
Python 有办法将任意值转为字符串:将它传入repr() 或str() 函数. 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式 (如果没有等价的语法,则会 ...
- 【UOJ 117】欧拉回路
#117. 欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 输入格式 第一行一个整数 t, ...
- QT学习笔记1:VS2015配置QT5.11
由于工作关系,我又接触到了QT,在之前写过一篇博客是 在vs2017下配置openCV,当时用的是2015做的示范,现在就继续记录一下在VS2015下配置QT吧(VS2017配置是一样的) 第一部分: ...
- [Codeforces #201] Tutorial
Link: 传送门 代码量很少的一套思维题 A: 试一试发现最后状态一定是所有$min,max$间$gcd$的倍数 直接判断数量的奇偶性即可 #include <bits/stdc++.h> ...
- Codeforces Beta Round #5 D. Follow Traffic Rules 物理
D. Follow Traffic Rules 题目连接: http://www.codeforces.com/contest/5/problem/D Description Everybody kn ...
- CentOS 6.9下的iptables在本机用DNAT转发指定IP到内网IP无效的问题解决(127.0.0.1)
比如: iptables -t nat -A OUTPUT -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0 ...
- [转].net reactor 学习系列(四)---.net reactor应用场景
前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和许可证发放场景.如果想应用更高级的场景比如自动化程序许可证的发放及自定义客户端的过期提示等等就需要自己 ...