剑指offer——面试题20:表示数值的字符串

 1 #include"iostream"
 2 using namespace std;
 3
 4 bool IsInt(const char **str);
 5 bool IsUnsignInt(const char **str);
 6
 7 bool IsNumeric(const char* str)
 8 {
 9     if(str==nullptr)
10         return false;
11     bool flagNumeric=IsInt(&str);//二阶指针才能保留更改
12
13     if(*str==‘.‘)
14     {
15         str++;
16         flagNumeric=IsUnsignInt(&str)||flagNumeric;//要把flagNumeric放后面
17     }
18     if(*str==‘E‘||*str==‘e‘)
19     {
20         str++;
21         flagNumeric=flagNumeric&&IsInt(&str);
22     }
23     return flagNumeric&&*str==‘\0‘;
24 }
25
26 bool IsInt(const char **str)//确保*str的内容不被修改
27 {
28     if(**str==‘+‘||**str==‘-‘)
29         (*str)++;
30     return IsUnsignInt(str);
31 }
32
33 bool IsUnsignInt(const char **str)
34 {
35     int numLength=0;
36     while(**str!=‘\0‘&&**str>=‘0‘&&**str<=‘9‘)
37     {
38      //   cout<<**str;
39         (*str)++;
40         numLength++;
41     }
42  //   cout<<**str;
43     return numLength>0?true:false;
44 }
45
46 // ====================测试代码====================
47 void Test(const char* testName, const char* str, bool expected)
48 {
49     if(testName != nullptr)
50         printf("%s begins: ", testName);
51
52     if(IsNumeric(str) == expected)
53         printf("Passed.\n");
54     else
55         printf("FAILED.\n");
56 }
57
58
59 int main()
60 {
61     Test("Test1", "100", true);
62     Test("Test2", "123.45e+6", true);
63
64     Test("Test3", "+500", true);
65     Test("Test4", "5e2", true);
66     Test("Test5", "3.1416", true);
67     Test("Test6", "600.", true);
68     Test("Test7", "-.123", true);
69     Test("Test8", "-1E-16", true);
70     Test("Test9", "1.79769313486232E+308", true);
71
72     printf("\n\n");
73
74     Test("Test10", "12e", false);
75     Test("Test11", "1a3.14", false);
76     Test("Test12", "1+23", false);
77     Test("Test13", "1.2.3", false);
78     Test("Test14", "+-5", false);
79     Test("Test15", "12e+5.4", false);
80     Test("Test16", ".", false);
81     Test("Test17", ".e1", false);
82     Test("Test18", "e1", false);
83     Test("Test19", "+.", false);
84     Test("Test20", "", false);
85     Test("Test21", nullptr, false);
86
87     return 0;
88 }

原文地址:https://www.cnblogs.com/acm-jing/p/10416692.html

时间: 2024-08-06 08:18:19

剑指offer——面试题20:表示数值的字符串的相关文章

二叉树层次遍历(剑指Offer面试题32:从上到下打印二叉树)

图1所示为二叉树的层次遍历,即按照箭头所指方向,按照1.2.3的层次顺序,对二叉树每个节点进行访问 (此图反映的是自左至右的层次遍历,自右至左的方式类似). 要进行层次遍历,需要建立一个队列.先将二叉树头节点入队列,然后出队列,访问该节点, 如果它有左子树,则将左子树的根结点入队:如果它有右子树,则将右子树的根结点入队.然后出队列,对出队节点访问, 如此反复直到队列为空为止. 1 import java.util.*; 2 class TreeNode 3 { 4 int val; 5 Tree

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

[ 剑指offer ] 面试题8:二叉树的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路 1.找到所有的可能情况并归纳,写的代码需要把这些情况都覆盖到. 2.具体情况详见书本# -*- coding:utf-8 -*- # class TreeLinkNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # self

剑指offer 面试题8:旋转数组的最小数字 题解

面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个已从小到大排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.(要求不能直接遍历数组来求解.) 提交网址: http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159 或 http: