关注我前端宝剑
一个常见的算法问题是反转正整数:将 12345 变成 54321。乍一看,这个问题似乎很简单——将整数转为字符串,然后转为数组,反转数组,然后将其转为字符串,最后再次化为整数。虽然该解决方案可能会得到“54321”,但这并不是解决问题的最佳方法。
如果算法的输入值是整数,并且预期输出是整数,那么问题的最佳解决方案不涉及将整数转换为另一种数据类型。相反,要解决简单的“反转整数”问题,您应该使用模和简单的数学。
首先要做的是编写一个函数,我将其称为reverseNum,它接受一个数字。然后,初始化一个新变量,调用result并将其设置为零。结果就是你最终将返回的结果:
function reverseNum(num) {
let result = 0
//...
return result
}
现在,您想要对数字执行操作,直到输入等于零。为此,创建一个 while 循环:
function reverseNum(num) {
let result = 0
while (num > 0) {
//...
}
return result
}
在 while 循环内,您要做的第一件事是获取数字的模。模运算符 (%) 返回余数,因此如果执行类似 的操作13%10,结果将为 3,因为 13/10 的余数为 3。在此算法中,您需要重复获取输入数字的最后一个值,这可以使用模来完成
function reverseNum(num) {
let result = 0
while (num > 0) {
let mod = num % 10
//...
}
return result
}
现在您已经有了模数,您需要修改原始数字,以便最终值不再包含在数字中。为此,您必须将数字除以 10,并对该操作执行 Math.floor() :
function reverseNum(num) {
let result = 0
while (num > 0) {
let mod = num % 10
num = Math.floor(num/10)
//...
}
return result
}
最后,您需要修改“结果”变量。您想要将“mod”添加到结果中,但每次执行 while 循环时,您都需要将现有结果乘以 10,以便它变得更长,而不是简单地将数字的所有值相加: 就是这样!为了测试这个解决方案是否有效,让我们使用真值表尝试数字“123”:
| 结果 | mod | num |
|---|---|---|
| 0 | 3 | 12 |
| 0*10 +3 = 3 | 2 | 1 |
| 3*10 +2 = 32 | 1 | 0 |
| 32*10+1 = 321 |
由于 num 现在为 0,因此 while 循环不再执行,函数返回结果,即 321。
如果输入可以是正数或负数,您可以通过在开始时检查是否正确来轻松修改此函数,然后根据需要在末尾添加负号。
首先,实例化一个变量并将其设置为布尔值。如果输入数字为正数,则无需更改变量。如果为负数,则将该变量设置为“false”,并将输入的数字设置为其自身的绝对值:
function reverseNum(num) {
let pos = true
if (num < 0) {
pos = false
num = Math.abs(num)
}
let result = 0
while (num > 0) {
let mod = num % 10
num = Math.floor(num/10)
result = result * 10 + mod
}
//...
}
然后,在最终的 return 语句中,您需要检查 'pos' 变量是 true 还是 false。如果为 true,则只需返回结果即可。如果为 false,则说明输入的值为负数,因此返回结果乘以 -1:
function reverseNum(num) {
let pos = true
if (num < 0) {
pos = false
num = Math.abs(num)
}
let result = 0
while (num > 0) {
let mod = num % 10
num = Math.floor(num/10)
result = result * 10 + mod
}
return pos ? result : (-1 * result)
}