剑指 Offer 67. 把字符串转换成整数

26 篇文章 0 订阅
26 篇文章 0 订阅

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42
class Solution {
public:
    int myAtoi(string s) {
            //特殊处理,空字符串
            if(s.empty()) return 0;
            long long ans=0;
            int n=0;
            while(s[n]==' ')n++;
            //取出字符串开头多余空格
            s=s.substr(n);
            int postFlag=0;
            int negFlag=0;
            int numFlag=0;
            for(int i=0;i<s.size();i++){
                //负数处理,第一次出现
                if(s[i]=='-'){
                    if(negFlag==0&&postFlag==0&&numFlag==0)
                    {
                        negFlag=1;continue;
                    }else break;
                }
                //正数处理,第一次出现
                if(s[i]=='+'){
                    if(negFlag==0&&postFlag==0&&numFlag==0)
                    {
                        postFlag=1;continue;
                    }else break;
                }
                if(isdigit(s[i])){
                    if(ans>INT_MAX)break;
                    ans=ans*10+(s[i]-'0');
                    numFlag=1;
                }else break;
            }
            if(negFlag==1)ans=-ans;
            ans=max(ans,(long long )INT_MIN);
             ans=min(ans,(long long )INT_MAX);
            return ans;
    }
};
#include <stdio.h>
#include <iostream>
using namespace std;
#include <climits>
int strToInt(string str); 
int main(void) {
   int x=2;
   	//0x004013be <+14>:	mov    DWORD PTR [esp+0x18],0x2
   //0x004013c6 <+22>:	lea    eax,[esp+0x18]
   //0x004013ca <+26>:	mov    DWORD PTR [esp+0x1c],eax
   //0x004013ce <+30>:	mov    eax,DWORD PTR [esp+0x1c]
   //0x004013d2 <+34>:	mov    eax,DWORD PTR [eax]
  // 0x004013d4 <+36>:	mov    DWORD PTR [esp+0x8],eax
  // 0x004013d8 <+40>:	mov    eax,DWORD PTR [esp+0x1c]
   //0x004013dc <+44>:	mov    DWORD PTR [esp+0x4],eax
   //0x004013e0 <+48>:	mov    DWORD PTR [esp],0x403064
  // 0x004013e7 <+55>:	call   0x401cc0 <printf>
    int *p=&x;
	printf("地址=%d 数值= %d\n",p,*(p));
	
	int arr[5]={10,2,30,4,5};
	int *pt=arr;
	cout<<*pt<<endl; 
	cout<<"*++pt"<<*++pt<<endl; 
	//cout<<"++*pt"<<++*pt<<endl; 
	cout<<"*pt++"<<*(pt++)<<endl; 
	cout<<*pt<<endl;
	printf("char size = %d\n", sizeof(char));
    printf("short size = %d\n", sizeof(short));
    printf("int size = %d\n", sizeof(int));
    printf("long size = %d\n", sizeof(long int));
    printf("long long size = %d\n", sizeof(long long));
    printf("float size = %d\n", sizeof(float));
    printf("double size = %d\n", sizeof(double));
    printf("long double size = %d\n", sizeof(long double));
    int n=0;
    //int m=strToInt("  4193 with words");-91283472332
    int m=strToInt("  91283472332 with words");//1089159116 91283472332
    cout<<m<<"ge";
    return 0;
}

int strToInt(string str) {
	if(str.empty())return 0;
	int n=0;
	while(str[n]==' ')n++;
	int negtive=0;
	int postive=0;
	int numFlag=0;
	str=str.substr(n);
	int ans=0;
	for(int i=0;i<str.size();i++){
		cout<<str[i];
		if(str[i]=='-'){
			if(negtive==0&&postive==0&&numFlag==0){
				negtive=1;continue;
			}else break;
		}
		if(str[i]=='+'){
			if(negtive==0&&postive==0&&numFlag==0){
				postive=1;continue;
			}else break;
		}
		if(isdigit(str[i])){
			//这个地方结果可能大于最大值 
			ans=ans*10+str[i]-'0';

		}
		
	}
	if(negtive==1)ans=-ans;
	if(ans>INT_MAX){
				return INT_MAX;
			}
			if(ans<INT_MIN){
				return INT_MIN;
			}
			
	return ans;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lst0426

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

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

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

打赏作者

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

抵扣说明:

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

余额充值