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

2023-07-08 10:36:16 浏览数 (1)

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

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

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

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

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

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

说明:

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

示例 1:

代码语言:javascript复制
输入: "42"
输出: 42
代码语言:javascript复制
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;
    }
};
代码语言:javascript复制
#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 数值= %dn",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 = %dn", sizeof(char));
    printf("short size = %dn", sizeof(short));
    printf("int size = %dn", sizeof(int));
    printf("long size = %dn", sizeof(long int));
    printf("long long size = %dn", sizeof(long long));
    printf("float size = %dn", sizeof(float));
    printf("double size = %dn", sizeof(double));
    printf("long double size = %dn", 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 人点赞