【剑指offer】53.表示数值的字符串

题目

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。


分析

本题的主要解题思路如下:

  1. 首先判断字符串是否为空,或者首元素是否为‘.’,若是是则直接返回false;
  2. 否则,判断首元素是否为‘+’或者‘-’,若是则将循环变量赋值为i=1,否则则将循环变量赋值为i=0;
  3. 初始化flag=true,之后开始遍历整个字符串,若字符为大小写的字母(不包含‘e’和‘E’),则flag=false并终止遍历,
  4. 否则,若字符为‘+’或‘-’,则flag=false并终止遍历,若字符为‘0’到‘9’的数字,则接着遍历字符串,若字符为‘.’且第一次出现,小数点计数器cnt++,否则flag=false并终止遍历,若字符为‘E’或者‘e’,那么判断后面字符子串是否为数字,并结束遍历。

github链接:JZ53-表示数值的字符串


C++代码

#include <iostream>
#include <cstring>
using namespace std;

class Solution {
	public:
		bool check_science(char* str){
			int length = strlen(str);
			int j = 0;
			if(str[0] == '+' || str[0]){
				j = 1;
			}
			bool flag1 = true;
			for(; j < length ; j++){
				if(str[j] == '.' ){
					flag1 = false;
					break;
				}else if((str[j] >= 'a' && str[j] <= 'z') ||
							(str[j] >= 'A' && str[j] <= 'Z')){
								flag1 = false;
								break;
				}else if(str[j] == '+' || str[j] == '-'){
					flag1 = false;
					break;
				}else if(str[j] >= '0' || str[j] <= '9'){
					continue;
				}
			}
			return flag1;
		} 
		
	    bool isNumeric(char* string){
		   if(string == NULL || string[0] == '.'){
		   	    return false;
		   }
		   int len = strlen(string);
		   bool flag = true;
		   int cnt1 = 0;			// 小数点个数 
		   int i = 0;			    // 循环变量 
		   if(string[0] == '+' || string[0] == '-'){
				i = 1;
		   }
		   for(;i < len ; i++){
				if(((string[i] >= 'a' && string[i] <='d')||(string[i] >= 'f' && string[i] <= 'z'))
					|| ((string[i] >= 'A' && string[i] <='D')||(string[i] >= 'F' && string[i] <= 'Z'))){
						flag = false;
						break;
				}else{
					// 再次出现正负号 
					if((string[i] == '+' || string[i] == '-')){
						flag = false; 
						break;
					}else if(string[i] >= '0' && string[i] <= '9'){
						continue;
					}else if(string[i] == '.'){
						if(cnt1 == 0){
							cnt1++;
						}else{
							flag = false;
							break;
						}
					}else if(string[i] == 'E' || string[i] =='e'){
						if(i == len -1){		//‘E’或‘e’后面没有数字了 
							flag = false;
							break;
						}else{ 
							flag = this->check_science(string+i+2);
							break;
						}
					}
				}
		   }
		   return flag; 
	    }
};

int main()
{
	string str;
	Solution s;
	while(cin>>str){
		char* string = (char*) str.c_str();
		cout<<s.isNumeric(string)<<endl;
	}
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daipuweiai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值