玩转算法面试 leetcode-反转整数

本文详细解析了LeetCode中的反转整数问题,包括正负数的处理方式,通过数组反转并转化为整数的方法。文章还讨论了在C/C++中处理数组和越界问题的技巧,以及32位int类型的范围限制。同时,提醒在编程中如何避免整数溢出,并指出C语言中可通过limits.h获取最大和最小整数值。
摘要由CSDN通过智能技术生成

 

int reverse(int x) {
	int  a[23];
	// sprintf(str, "%d", x);//将v转为字符串。
	int b = 0;
	int len = x< 0 ? -x : x;
	while (len>0)
	{
		len = len / 10; //1/2=0,参与运算的量均为整型时,结果为整型,舍去小数,5/2.0=2.5 
		b = b + 1;
	}
    long long int sum=0;
	if (x>0)
	{
		for (int i = b; i>0; i--)
		{
			a[i - 1] = x % 10;
			x /= 10;
            sum = sum+a[i-1]*pow(10,i-1);
		}
        
	}
	else {
		x = -x;
		for (int i = b; i>0; i--)
		{
		    a[i - 1] = x % 10;
			x /= 10;
            sum = sum+a[i-1]*pow(10,i-1);
		}
        sum= -sum;
	}
    if(sum >INT_MAX -1 || sum< -INT_MAX )
    {
        return 0;
    }else{
        return sum;
    }
   
	
}

思路:分正负数

如果是负数:取反,分别取出每位数放进数组进行反转,考虑到函数输出的必须是数,所以将数组转化为数:用对应的数乘以10的对应数次方然后相加(注意sum的取值会超范围),然后取反,

如果是正数:分别取出每位数放进数组进行反转,考虑到函数输出的必须是数,所以将数组转化为数:用对应的数乘以10的对应数次方然后相加(注意sum的取值会超范围)

知识点,

1、利用

while (len>0)
    {
        len = len / 10; //1/2=0,参与运算的量均为整型时,结果为整型,舍去小数,5/2.0=2.5 
        b = b + 1;
    }

去求数x的个数,这个对整数很管用,(1/2=0,参与运算的量均为整型时,结果为整型,舍去小数,5/2.0=2.5)

2、在c中怎么从数组中传出数组 

int  *reserve(int w)
{
stastic int a[23];
return a;
}

C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。

如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:

int * myFunction() { . . . }

另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

这个题目必须是传数,所以没有用这个方法。

3、注意越界的问题
if(sum > INT_MAX -1 || sum <-INT_MAX){
   return 0;
}else{
  return sum;
}

计算机中32位int类型变量的范围,其中int类型是带符号整数。正数在计算机中表示为原码,最高位为符号位:

1的原码为0000 0000 0000 0000 0000 0000 0000 0001

2147483647的原码为0111 1111 1111 1111 1111 1111 1111 1111

所以最大的正整数是2147483647,负数在计算机中表示为补码,最高位为符号位:-1:

原码为1000 0000 0000 0000 0000 0000 0000 0001,

反码为1111 1111 1111 1111 1111 1111 1111 1110,

补码为1111 1111 1111 1111 1111 1111 1111 1111

-2147483647:

原码为1111 1111 1111 1111 1111 1111 1111 1111,

反码为1000 0000 0000 0000 0000 0000 0000 0000,

补码为1000 0000 0000 0000 0000 0000 0000 0001

所以最小的负数是-2147483647吗?错,不是。

在二进制中,0有两种表方法。

+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,

-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,

因为0只需要一个,所以把-0拿来当做一个最小的数-2147483648。

-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。

注意,这个补码并不是真正的补码,真正的补码是1 1000 0000 0000 0000 0000 0000 0000 0000,溢出。

所以带符号32位int类型整数为-2147483648~2147483647

在编程中怎样使用最大和最小的数呢?C语言在limits.h中包含了极大和极小的整数值,直接调用就可以了。

  1. #include <limits.h>

  2. #include<stdio.h>

  3. int max = INT_MAX;//最大数

  4. int min = INT_MIN;//最小数

  5. int main(){

  6. printf("max = %d\nmin = %d\n", max, min);

  7. return 0;

  8. }

彩蛋:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值