(剑指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 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
随机推荐
- GeneXus项目启动
使用GeneXus产品开发项目时,在开始,有一些属性我会经常改一下.我现在使用的GeneXus版本是GeneXus U3,由于在做手机应用的开发,所以一般使用最新的版本,老外那边差不多两个月会有一个u ...
- FastReport.Net使用:[10]报表栏目说明
报表栏目说明 报表标题(Report Title):在每个报表的开始时打印. 报表合计区(Report Summary):在报表结尾时打印,显示在最后一行数据后,页脚前. 页眉(Page Header ...
- HDU4893【线段树单点、区间更新】
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=4893] 题意:输入n.q.表示有n个数,初始化默认这n个数都为零,有q次操作,操作种类分为三种:1.输 ...
- ContentType组件,Django缓存机制,跨域请求
ContentType组件 解决什么问题:表的id和数据id,来唯一确定一条数据 用: 插入数据: models:content_obj = GenericForeignKey('table_id', ...
- php -- php读取sqlserver中的datetime出现的格式问题
php连接sqlserver2005时,读取出来的数据是01 15 2014 12:00AM, 也就是说日期的格式是MM DD YY hh:mmAM 那如何把它转变成24小时制,且显示的格式为YY-M ...
- memcached添加日志输出
引子:qa的memcached总是隔一段时间挂掉,导致qa进不去.决定查一下原因,于是添加日志输出,等下次出错便于查阅.定位问题. memcache默认没有日志输出.如果想把memecache服务日志 ...
- TCP长连接与短链接
1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...
- java常用工具方法2
/* * Copyright 2005 Joe Walker * * Licensed under the Apache License, Version 2.0 (the "License ...
- Current limiter allows large USB bypass capacitance
The USB (Universal Serial Bus) specification requires a connected USB device to present a load to th ...
- Hibernate:不容易理解的 lock 和 merge
背景 lock 和 merge 在字面上很容易理解它们的语义,不过它们的实际行为所代表的语义范围要大一点,本文就简单的记录下来,还请朋友们多批评和指正. Lock 官方的注释 /** * Obtain ...