新手算法入门:整数反转问题
给你一个有符号整数 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