【剑指Offer】【字符串】表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
A:格式有 A[.B][E|e C] 或 .B[E|e C] ===> A整数 B小数 C指数
取三个标记:符号标记、小数点标记、E|e标记
(1)判断当前字符是否是'E'或'e',E|e后一定要接数字,而且不能同时存在两个e
(2)判断当前字符是否是'+'或'-',第一次出现符号且不是整数部分时,必须在e之后;第二次出现符号必须在e之后;
(3)判断当前字符是否是'.'小数点,小数点不能出现两次,而且不能在指数部分
(4)如果当前字符不是以上5种符号,且不为数字,则返回false
class Solution { public: bool isNumeric(char* str) { bool flag_sign = false; //符号 bool flag_decimal = false; //小数点 bool flag_hasE = false; //e/E for (int i = 0; i < strlen(str); i++) { if ((str[i] == 'e') || (str[i] == 'E')) { if (i == strlen(str) - 1) { return false; // e后面一定要接数字 } if (flag_hasE) { return false; // 不能同时存在两个e } flag_hasE = true; } else if ((str[i] == '+') || (str[i] == '-')) { // 第二次出现+-符号,则必须紧接在e之后 if (flag_sign && ((str[i - 1] != 'e') && (str[i-1] != 'E'))) { return false; } // 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后 if (!flag_sign && (i > 0) && ((str[i-1] != 'e') && (str[i-1] != 'E'))) { return false; } flag_sign = true; } else if (str[i] == '.') { // e后面不能接小数点,小数点不能出现两次 if (flag_hasE || flag_decimal) { return false; } flag_decimal = true; } else if ((str[i] < '0') || (str[i] > '9')) // 不合法字符 { return false; } } return true; } };
相关题目
字符串匹配:牛牛有两个字符串A和B,其中A串是一个01串,B串中除了可能有0和1,还可能有'?',B中的'?'可以确定为0或者1。 寻找一个字符串T是否在字符串S中出现的过程,称为字符串匹配。牛牛现在考虑所有可能的字符串B,有多少种可以在字符串A中完成匹配。
字符串分类:牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。现在牛牛想知道这N个字符串可以分成几类。
字符串价值:有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值例如: 字符串"abacaba",里面包括4个'a',2个'b',1个'c',于是这个字符串的价值为4 * 4 + 2 * 2 + 1 * 1 = 21牛牛有一个字符串s,并且允许你从s中移除最多k个字符,你的目标是让得到的字符串的价值最小。