给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/reverse-integer
自己的思路:
首先是获取输入整数的位数n,从i位数取10^(i+1)的余数再除以10^i就获得i+1位数,再乘以反转后对应的10^(n-i-1)就获得反转后对应的数,最后循环遍历相加起来就得到反转数。
C语言:
#include<math.h>
longpow1(intn,intm){
longz=1;
for(inti=0;i<m;i++){
z=n*z;
}
returnz;
}
intreverse(intx){
intb=x;
intn=1;
while(b/10!=0){
b=b/10;
n++;
}
if(abs(x)>pow1(2,31)-1){
return0;
}
intr=0;
if(x<0){
x=x*-1;
for(inti=0;i<n;i++){
r+= (x%pow1(10,i+1)/pow1(10,i))*pow1(10,n-i-1);
}
}else{
for(inti=0;i<n;i++){
r+= (x%pow1(10,i+1)/pow1(10,i))*pow1(10,n-i-1);
}
}
if(abs(r)<pow1(2,31)-1){
returnr;
}else{
return0;
}
}
// 时长:4ms 空间:5.3MB
大佬思路:
反转的思想是取余再乘相应的位权
Go语言:
作者:zoffer链接:https://leetcode.cn/problems/zigzag-conversion/solution/ji-jian-jie-fa-by-ijzqardmbd/
这个佬的解题过程给得很清晰。
//注意范围可以用INT_MIN和INT_MAX表示(调用库)
//注意负数取余问题,计算机里取余是商靠近0原则,所以负数%10就是最低位本身
intreverse(intx){
inti=0;
while(x){
if (i<INT_MIN/10||i>INT_MAX/10) { //注意,循环的过程中就要判断是否会 溢出
return0;
}
i=i*10+x%10;
x=x/10;
}
returni;
}
// 时长:0ms 空间:5.6MB
Go语言:
(双100%需要多提交几次才会出现,我第一次提交就双100%,天真的以为每次都可以双100%@3@))1.采用 % 取余 和 / 取商 的的思路。2.充分利用go语言的数据类型特点。1)先用int类型res接受int类型x的反转结果;2)关键点:判断res是否超出int32的长度,将res转化为int32类型:int32(res)并赋值给temp,方便判断;3.判断方法:提前赋值判断。如果temp10是溢出的,那么(temp10)/10不会等于temp,从而终止程序return 0;4.注意:无需判断x为正负值的情况。res的正负值是根据x来的,因为res的初始值等于x%10也就直接决定了res的值是否是正或负,而res的后续值是根据初始res值来进行变化的。
作者:li-er-dan-2链接:https://leetcode.cn/problems/reverse-integer/solution/shuang-100ji-bai-yong-hu-gan-shou-goyu-yan-zhi-you/
funcreverse(xint) int {
varresint
forx!=0 {
iftemp :=int32(res); (temp*10)/10!=temp {
return0
}
res=res*10+x%10
x=x/10
}
returnres;
}
// 时长:0ms 空间:5.6MB
总结:
这道题其实很简单,但是难点在于输入的整数的限制条件怎么去判断,自己对基本数据类型的认识不足还是需要多看书\多学习.
收获:
了解到C语言数据类型的基本含义.
学习链接:
C语言数据类型-https://www.runoob.com/cprogramming/c-data-types.html