字符串转整型数字

字符串转整型数字(点击进入题目)

描述
  将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
  输入一个字符串,包括数字字母符号,可以为空
返回值描述:
  如果是合法的数值表达则返回该数字,否则返回0
示例1
  输入:"+2147483647"
  返回值:2147483647
示例2
  输入:“1a33”
  返回值:0

题目分析:1、首先需要明确的是,什么是合法的数值表达式,如果该字符串中含有任意字母,则表明该字符串不是合法的数值表达式;如果是合法的数值表达式,第一个字符是否是符号位,这是要进行判断的,如果是符号位,后面实际数值的长度则要减1。
     2、在判断完以上的步骤后,就可以将字符转换为数字,并存储到事先准备的变量中,然后循环取出字符串中的每个数字。

解题

   a:先写一个IsLetter函数,用来判断某个字符是否为字母,如果该字符串中的某个字符为字母,直接返回0即可,所以在函数的开始,先遍历一遍原字符串,如果有字母,则直接返回0。
   b:如果函数继续往下走,则说明字符串中没有字母,是合法的数值表达式,此时要判断的是字符串中的第一个字符是否为符号位(+、-),我们这里设置一个标志位flag,如果字符串的第一个字符是+,则flag为1,如果第一个字符为-,则flag为-1,如果第一个字符不是标志位,则默认为正数,则flag保持为1。
   c:定义ret、index、str_size三个变量用来存值或者记录信息,详细信息看代码注释。
   d:进入for循环对每个字符的进行整型转换并作相应的处理。

class Solution {
public:
    bool IsNumber(char ch)
	{
		if (ch >= '0' && ch <= '9')
			return true;
		else
			return false;
	}
	//判断某个字符是否为字母
    bool IsLetter(char ch)
	{
		if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
			return true;
		else
			return false;
	}
    int StrToInt(string str) {
    //1、遍历该字符串,判断字符串中的每个字符是否是字母,如果有则直接返回0,如果不是,则继续往下走。
        for(size_t i = 0; i < str.size(); i++)
        {
            if(IsLetter(str[i]))
                return 0;
        }
        
        int ret = 0;//用来存储值
        int flag = 1;//标志位,用来判断第一个字符是否为符号位
        int index = 0;//用来记录下标,即此时应判断字符串中的第几个位置
        int str_size = str.size();//str_size表示字符串的长度
        
        //如果第一个字符是符号位'+',则将标志位置1,index++,表明在转整型的时候从字符串的第二个位置开始,
        //然后将字符串有效字符的长度-1
        if(str[index] == '+')
        {
            flag = 1;
            index++;
            str_size--;
        }
        //如果第一个字符是符号位'-',则将标志位置-1,index++,表明在转整型的时候从字符串的第二个位置开始,
        //然后将字符串有效字符的长度-1
        if(str[index] == '-')
        {
            flag = -1;
            index++;
            str_size--;
        }
        
        //代码运行到这里说明对第一个位置的判断已经完成,如果第一个位置是符号位,则遵循上面的结果,此时index为1,
        //从字符串第二个位置开始工作,如果第一个位置不是符号位,此时index为0,仍从字符串第一个位置工作
        for(size_t i = index; i < str.size(); i++)
        {
            //对每个是数字的字符进行操作,加不加这个if都可以,因为运行到这里已经是合法的数值表达式,加上是为了严谨
            if(IsNumber(str[i]))
            {
                int number = str[i] - '0';
                //用ret来记录每个位置的值相加的结果
                //这里str_size的作用就体现出来了,每个位置转换位int类型的数字之后,与pow(10, str_size - 1)相乘,
                //就是该位的实际值的大小,然后依次相加,并将str_size--即可
				ret += (number * (pow(10, str_size - 1)));
                str_size--;
            }
        }
        //将算出的值与符号位相乘就是最后的答案
        return ret * flag;
    }
};

在这里插入图片描述

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

做1个快乐的程序员

感谢支持,一起加油努力!

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

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

打赏作者

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

抵扣说明:

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

余额充值