有符号整数反转问题——算法新手入门

新手算法入门:整数反转问题

给你一个有符号整数 x ,返回将 x 中的数字部分反转后的结果。
采用python求解
比如:

输入:x = 123
输出:321

同样对于负数而言也一样

输入:x = -123
输出:-321

对于这个问题,首先应该有的思路是整除和取余数,二者结合可以获取整数的各个位数,重新排列这些位数便可以求解问题。
比如对于最简单的两位数反转:输入为45,将45整除10,便可以得到十位数4,将45用10取余数得到个位数5,将5乘以十加上4便是解。

45//10=4
45%10=5

两位数的情况是很简单的。但如果是三位或者更多位,该怎么办?
再来看看三位数的情况,看看能不能归纳出一些规律
输入为123,那么参照两位数的情况,3是很容易提取出来的

123%10=3

那么将个位数提取后,用整除的方法可以将三位数变为两位数

123//10=12

这时候再对这个两位数分析,自然就简单了许多。并且可以看出这个解法对于更多位数的值都适用。
输入应该很长位数的值:123456
先提取它的个位6,再整除10,得到12345。再对12345提取个位5,继续整除10,依次类推,就能提取出所有的数。
以下是函数实现

def reverse(x):
    # sign用来判断正负
    sign = 1
    result = 0
    # x小于10可直接输出
    if abs(x) < 10:
        return x
    if x < 0:
        x = abs(x)
        sign = -1
    nums = []
    # 只要x不为0,便对其进行提取,将提取的数放入数组
    while x > 0:
        remainder = x % 10
        nums.append(remainder)
        x = x // 10
    for i in range(len(nums)):
        result += nums[-(i + 1)] * 10 ** i
    return sign * result

先用sign标记x的正负性,再对其取绝对值,将其统一成正数进行操作。
不断用10对x取余,直到x为0,并用一个数组将这些数一一记录。
从数组中从后往前取出元素,并乘以10的对应次方,加到result中,就能得到翻转的数。

x=1234
nums=[1,2,3,4]
result=4X103+3X102+2X10+1=4321

通过数组的方法使这个函数很容易读懂,但其实数组是可以省略的。优化时,可以把结果的计算result直接放在while循环中,以下是改进后的代码:

def reverse(x):
    # sign用来判断正负
    sign = 1
    result = 0
    # x小于10可直接输出
    if abs(x) < 10:
        return x
    if x < 0:
        x = abs(x)
        sign = -1
    # while循环内的内容发生改变
    while x > 0:
        remainder = x % 10
        result=result*10+remainder
        x = x // 10
    return sign * result

这就相当于我们取消了中间步骤,将取得的余数 remainder直接加到result中,更改后的代码更难读懂一些,但是效率却快上不少,也省去了多余的空间。

x=1234
result=(((4+0)X10+3)X10+2)X10+1=4321

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值