php网站建设教程 电子书,胶南网站建设,python网站开发流程,百度游戏【剑指offer-C】JZ20#xff1a;表示数值的字符串题目描述解题思路题目描述
描述#xff1a;请实现一个函数用来判断字符串str是否表示数值#xff08;包括科学计数法的数字#xff0c;小数和整数#xff09;。
科学计数法的数字(按顺序#xff09;可以分成以下几个部分…
【剑指offer-C】JZ20表示数值的字符串题目描述解题思路题目描述
描述请实现一个函数用来判断字符串str是否表示数值包括科学计数法的数字小数和整数。
科学计数法的数字(按顺序可以分成以下几个部分: 1.若干空格 2.一个整数或者小数 3.可选一个 ‘e’ 或 ‘E’ 后面跟着一个整数(可正可负) 4.若干空格
小数按顺序可以分成以下几个部分 1.若干空格 2.可选一个符号字符‘’ 或 ‘-’ 3. 可能是以下描述格式之一: 3.1 至少一位数字后面跟着一个点 ‘.’ 3.2 至少一位数字后面跟着一个点 ‘.’ 后面再跟着至少一位数字 3.3 一个点 ‘.’ 后面跟着至少一位数字 4.若干空格
整数按顺序可以分成以下几个部分 1.若干空格 2.可选一个符号字符‘’ 或 ‘-’) 3. 至少一位数字 4.若干空格
例如字符串[“100”,“5e2”,“-123”,“3.1416”,“-1E-16”]都表示数值。 但是[“12e”,“1a3.14”,“1.2.3”,“±5”,“12e4.3”]都不是数值。
提示: 1.1 str.length 25 2.str 仅含英文字母大写和小写数字0-9加号 ‘’ 减号 ‘-’ 空格 ’ ’ 或者点 ‘.’ 3.如果怀疑用例是不是能表示为数值的可以使用python的print(float(str))去查看
进阶时间复杂度O(n) 空间复杂度O(n) 。
输入123.45e6
返回值true输入1.2.3
返回值false输入.
返回值false输入 .2
返回值true解题思路
表示数值的字符串最直观的想法是判断是否可以将字符串str转换为浮点数float此处可以调用python中的内置函数float如果发现异常则返回false否则返回true。注意虽然C中的stof函数也能够把字符串转换成浮点数但是其是读取到不满足即停止比如字符串1.2.3stof会将其转换为1.2但实际上整体是不能转换的。注意python代码注意缩进。
def isNumeric(self , str: str) - bool:try:float(str)except:return Falsereturn True正则匹配其实该题描述数字、空格、字母、正负号等非常适合正则匹配但是使用正则匹配需要对正则比较熟练。
^匹配行开头 $匹配行结尾 . 除换行的任意字符 []匹配[]中的任意一个字符 ()设定分组有几个()就有几个相应的匹配字符串 \d数字 \D\d取反 \w字母数字下划线 \W\w取反 \s空格 \S\s取反 *前面元素重复0次或者多次 前面元素重复1次或者多次 ?前面元素重复0次或者1次 \\ |逻辑或 {n}前面元素重复n次 {n,}前面元素重复至少n次 {n,m}前面元素重复至少n次至多m次
#includeregex //导入库
regex pattern(……); //模式串
smatch result; //匹配结果
bool retregex_match(str,result,pattern); //正则匹配bool isNumeric(string str)
{//\\s*表示若干空格//[-]?表示正负号可选//(\\d|\\d\\.\\d*|\\.\\d)表示整数或小数部分//([eE][-]?\\d)表示整数部分//\\s*表示若干空格regex pattern(\\s*[-]?(\\d|\\d\\.\\d*|\\.\\d)([eE][-]?\\d)?\\s*);return regex_match(str,pattern);
}常规判断符合大多数人直觉的解法还是枚举法枚举各种情况遍历每一个字符然后根据各种可能的情况进行标记。使用布尔变量isNum标记之前是否出现过数字使用布尔变量isDot标记之前是否出现过小数点使用布尔变量isE标记之前是否出现过e或者E三个变量均初始化为False。如果当前字符为数字则标记遇到数字如果当前字符为小数点则需要判断小数点之前不能出现小数点或者e或者E如果当前字符为e或者E则需要判断其前面必须要出现过数字并且不能出现e或者E同时后面可以出现数字如果当前字符为正负号则其必须是第一个非空白位置或者是e或者E后面的第一个位置。如果上述满足那么根据isNum是真还是假来返回。
remove(beg,end,value); //移除区间(beg,end)中每一个“与value相等”的元素
str.erase(remove(str.begin(),str.end(), ),str.end()); //删除字符串str两边的空格bool isNumeric(string str)
{bool isNumfalse,isDotfalse,isEfalse;//删除字符串str两边的空格str.erase(remove(str.begin(),str.end(), ),str.end());//coutstrendl;//coutstr.size()endl;for(int i0;istr.size();i){if(str[i]0str[i]9) //标记数字isNumtrue;else if(str[i].) //遇到小数点{if(isDot||isE) //判断合法性return false;isDottrue; //标记小数点}else if(str[i]e||str[i]E) //遇到e/E{if(!isNum||isE) //判断合法性return false;isEtrue; //标记e/EisNumfalse; //后面可以出现数字}else if(str[i]||str[i]-){if(i!0str[i-1]!estr[i-1]!E)return false;}else //不合法字符{ return false;}}return isNum;
}