(剑指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 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
随机推荐
- Java常用工具类之发送邮件
package com.csice.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- hdu 1180 诡异的楼梯(优先队列)
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向 ...
- 初识Linux 基础操作
Linux常用指令: 在Linux中如果不懂基础命令,在Linux中将寸步难行,下面是我在初学Linux系统时总结的一些基本命令. 1.基础命令 ls ...
- 【BZOJ 4169】 4169: Lmc的游戏 (树形DP)
4169: Lmc的游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 44 Solved: 25 Description RHL有一天看到lmc在 ...
- input限制中文字数
我们知道input控件有一个maxlength属性可以控制输入字符的长度,但是,它并不会识别是汉字还是其他符号,所以输入maxlength个汉字显然是不符合要求的. 为了实现对带有汉字的输入框长度控制 ...
- Unity UGUI之Button
创建Button后,会出现一个Image组件和一个Button组件,以及Button子节点Text(可以删除不影响功能) 其中Image的Image Type中有四个选项--Simple.Sliced ...
- mybatis源码分析(3)-----SqlSessionHolder作用
1. sqlSessionHolder 是位于mybatis-spring 包下面,他的作用是对于sqlSession和事务的控制 sqlSessionHolder 继承了spring的Resourc ...
- iframe里面的页面调用父窗口,左右窗口js函数的方法
iframe里面的页面调用父窗口,左右窗口js函数的方法 实现iframe内部页面直接调用该iframe所属父窗口自定义函数的方法. 比如有A窗口,A内有个IFRAME B,B里面的装载的是C页面 ...
- 断点续传队列和本地持久化(iOS源码)
// // ASIFormDataRequest.m // Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest // ...
- How to Distinguish a Physical Disk Device from an Event Message
https://support.microsoft.com/en-us/help/159865 https://support.microsoft.com/en-us/help/244780/inf ...