[LeetCode]整数反转 C++

思路:因为昨天做的题涉及到了将整形转换为字符串的函数,所以今天自然而然想到转换成字符串来处理。

难点:在于最后几个案例,一直在卡,就是字符串如果再转回整形需要与int比较的问题。但这里思考漏了一个地方就是int 最大表示为2147483647  有的字符串转回来就会溢出,以前很少解决这样的问题,不太熟。

1、先将字符反转并分情况讨论(正数、0、负数)且考虑到后期将字符串转化为整形的函数是会直接去掉前面的0的,所以此处不用去掉前面可能出现的0(类似于-0012这种)。

string s = to_string(x); 
        if(s[0]=='-'){//是负数的情况 
        	res += '-';
        	//对s进行翻转 
        	for(int i = s.length() -1;i>=1;i--){
        		res +=s[i];
			}
	}else if(s[0] == '0'&&s.length()==1){//是s = "0"的情况 cout<<s<<endl;
			res = "0";
	}else{//是正数的情况 
			for(int i=s.length()-1;i>=0;i--){
				res +=s[i]; 
			} 
	}

2、对于[-2^32,2^32-1] 的处理

(1)尝试过用移位的方式,但写出来是这种效果

cout<<(2<<30)<<endl;//-2147483648
cout<<(2<<31)<<endl;//0

(2)只有硬表示(2147483647)  这段代码是为了题目里那个范围超出时返回0

string jg = res;//jg 用于判断是否是负数
                int flag = 0;
		if(jg[0]=='-') {
		    jg.erase(0,1);flag = 1;//除去负号
		} 
        if(jg.length()>10){
        	return 0;
		}else if(jg.length()==10) {
			long long temp = atoll(jg.c_str());
			if(flag&&temp>=2147483647){//负数 
				return 0;
			}else if(!flag&&temp>=2147483647){//正数 
				return 0;
			}
		}

(3)正常返回,用到了string转long函数

	return atol(res.c_str()); 

全部代码

class Solution {
public:
	string res;
    int reverse(int x) {
        string s = to_string(x); 
        if(s[0]=='-'){//是负数的情况 
        	res += '-';
        	//对s进行翻转 
        	for(int i = s.length() -1;i>=1;i--){
        		res +=s[i];
			}
	}else if(s[0] == '0'&&s.length()==1){//是s = "0"的情况 cout<<s<<endl;
			res = "0";
			//return 0;
	}else{//是正数的情况 
			for(int i=s.length()-1;i>=0;i--){
				res +=s[i]; 
			} 
	}
		string jg = res;//jg 用于判断是否是负数
                int flag = 0;
		if(jg[0]=='-') {
		    jg.erase(0,1);flag = 1;//除去负号
		} 
        if(jg.length()>10){
        	return 0;
		}else if(jg.length()==10) {
			long long temp = atoll(jg.c_str());
			if(flag&&temp>=2147483647){//负数 
				return 0;
			}else if(!flag&&temp>=2147483647){//正数 
				return 0;
			}
		}
	return atol(res.c_str()); 
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值