JavaScript:如何翻转一个数字?

18

以下是我反转(如同镜子一般)给定数字的源代码。 我需要使用数组的反转方法来反转这个数字。

<script>
   
    var a = prompt("Enter a value");
    var b, sum = 0;
    var z = a;
    while(a > 0)
    {
      b = a % 10;
      sum = sum * 10 + b;
      a = parseInt(a / 10);
    }
    alert(sum);
</script>


你正在将所有数字加入总和,那么你应该如何反转它呢?你是指像123变成321这样反转单个数字吗? - Dominic
你的意思是要从用户那里获取输入,比如27,然后得到镜像反转后的数字72作为结果吗? - Abhijeet Chopra
该问题与数组中的项的编号无关。 - vsync
19个回答

47

低级整数反转:

function flipInt(n){
    var digit, result = 0

    while( n ){
        digit = n % 10  //  Get right-most digit. Ex. 123/10 → 12.3 → 3
        result = (result * 10) + digit  //  Ex. 123 → 1230 + 4 → 1234
        n = n/10|0  //  Remove right-most digit. Ex. 123 → 12.3 → 12
    }  
  
    return result
}


// Usage: 
alert(
  "Reversed number: " + flipInt( +prompt("Enter a value") ) 
)

以上代码使用位运算符进行快速数学计算。

这种方法比将数字转换为数组,然后反转并再次连接的其他方法快得多。这是一种底层的、闪电般快速的解决方案。

说明表格:

const delay = (ms = 1000) => new Promise(res => setTimeout(res, ms))
const table = document.querySelector('tbody')

async function printLine(s1, s2, op){
  table.innerHTML += `<tr>
    <td>${s1}</td>
    <td>${s2||''}</td>
  </tr>`
}

async function steps(){
  printLine(123)
  await delay()
  
  printLine('12.3 →')
  await delay()
  
  printLine(12, 3)
  await delay()
  
  printLine('1.2', '3 &times; 10')
  await delay()
  
  printLine('1.2 →', 30)
  await delay()
  
  printLine(1, 32)
  await delay()
  
  printLine(1, '32 &times; 10')
  await delay()
  
  printLine('1 →', 320)
  await delay()
  
  printLine('', 321)
  await delay()
}

steps()
table{ width: 200px; }
td {
  border: 1px dotted #999;
}
<table>
  <thead>
    <tr>
      <th>Current</th>
      <th>Output</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>


1
为什么在 n = n/10|0 中使用按位或运算符? - Verma Aman
@verma Aman,这是要去除小数部分的操作。321/10会得到32.1,我们只需要数字32而不需要小数部分。 - Tejaswi Pandava
不适用于127.12意味着对于十进制数无效。 - Gunal Bondre
@gunal - 不同的文化使用不同的浮点数表示方法,因此我忽略了浮点数,只翻转整数输入。 - vsync
1
在我的情况下,实际上使用 n.toString().split("").reverse().join("") 比较慢。 - scipper

11
假设 @DominicTobias 是正确的,您可以使用以下方法:

console.log( 
    +prompt("Enter a value").split("").reverse().join("") 
)


如果数字是负数怎么办?-123 将等于 NaN。 - Dzenis H.
在那种情况下,您希望结果是什么? - Arg0n
很明显吧?应该是“-321” :) - Dzenis H.
2
val < 0 ? -(Math.abs(val).split("").reverse().join("")) : +(val.split("").reverse().join("")); - Arg0n

4

我最近被问到如何解决这个问题,以下是我的初始解决方案:


期望的输出结果: 123 => 321,-15 => -51,500 => 5

function revInt(num) {
// Use toString() to convert it into a String
// Use the split() method to return a new array: -123 => ['-', '1','2','3']
// Use the reverse() method to reverse the new created array: ['-', '1','2','3'] => ['3','2','1','-'];
// Use the join() method to join all elements of the array into a string
  let val = num.toString().split('').reverse().join('');
    // If the entered number was negative, then that '-' would be the last character in
   //  our newly created String, but we don't want that, instead what we want is
  //  for it to be the first one. So, this was the solution from the top of my head.

// The endsWith() method determines whether a string ends with the characters of a specified string
  if (val.endsWith('-')) {
    val = '-' + val;
      return parseInt(val);
  }
      return parseInt(val);
}

console.log(revInt(-123));


更好的解决方案:

经过我再次思考,我想出了以下解决方案:

   // Here we're converting the result of the same functions used in the above example to 
// an Integer and multiplying it by the value returned from the Math.sign() function.

// NOTE: The Math.sign() function returns either a positive or negative +/- 1, 
// indicating the sign of a number passed into the argument.   

function reverseInt(n) {
      return parseInt(n.toString().split('').reverse().join('')) * Math.sign(n)
}

console.log(reverseInt(-123));

注意:在我看来,第二个解决方案更加直观易懂。

这段代码在处理非常大的整数时会失败,因为JS会将它们转换为指数符号,在toString操作中。例如10000000000000000000000000000647变成了1e+31,然后反转成13+e1,最终被parseInt解析成了13。 - LetMyPeopleCode

3
这是我的解决方案,纯JS且不使用预定义函数。

function reverseNum(number) {
  var result = 0,
    counter = 0;
  for (i = number; i >= 1 - Number.EPSILON; i = i / 10 - (i % 10) * 0.1) {
    counter = i % 10;
    result = result * 10 + counter;
  }
  return result;
}

console.log(reverseNum(547793));


不要处理第二个数字为0的数字,例如1401。 - Shyam Tayal
@ShyamTayal,你说得有一定道理。这并不是因为第二个数字等于零,因为1202会被正确地反转。实际上,这是JS的一个行为,其中0.3 - 02 !== 0.1。 非常感谢您的评论,因为我之前并不知道这一点。所以要精确,问题在于表达式i = i / 10 - (i % 10) * 0.1)不总是会评估为1,这在数学上是预期的,但在某些情况下,它将是最接近数字1(0.999999...)的十进制数。 所以我会编辑代码。再次感谢您。 - Aleksandar Biševac

1

首先,我认为你没有使用数组来存储数字。你正在使用JavaScript变量。

尝试运行此代码并查看是否有效。

var a = prompt("Enter a value");
var z = a;
var reverse = 0;
while(z > 0)
{
    var digit = z % 10;
    reverse = (reverse * 10) + digit;
    z = parseInt(z / 10);
}
alert("reverse = " + reverse);

1

最简单的解决方案是反转js中的任何整数。不适用于浮点数。

const i2a = number.toString().split("");
const a2i = parseInt(i2a.reverse().join(""));
console.log(a2i);

1
或者,作为一行代码(x 包含要反转的整数):
revX=x.toFixed(0).split('').reverse().join('')-0;

该数字将被分解为单个数字,并翻转,然后重新组合成字符串。然后-0将其转换回数字。

存在大整数问题。(10000000000000000000000000000647).toFixed(0)返回1e+31,将其拆分、翻转和合并后得到13 + e1。如果您使用parseInt来解析它,您会得到13。如果您执行 '13 + e1' - 0,您会得到 NaN - LetMyPeopleCode
其他方法中是否有任何一种“不受大整数问题困扰”? - Carsten Massmann

0

说明

使用JavaScript的reverse()数组方法,您可以反转数组元素的顺序。

代码

var a = prompt("Enter a value");
var arr = [];

for (var i = 0; i < a.length; i++) {
    arr[i] = a.charAt(i);
}
arr.reverse();
alert(arr);


0

var reverse = function(x) {
    if (x > 2147483647 || x < -2147483648 || x === 0) {
        return 0;
    }

    let isNegative = false;

    if(x < 0){
        isNegative = true;
        x = -x;
    }

    const length = parseInt(Math.log10(x));
    let final = 0;
    let digit = x;
    let mul = 0;

    for(let i = length ; i >= 0; i--){
        digit = parseInt(x / (10**i));
        mul = 10**(length-i);
        final = final + digit * mul; 
        x = parseInt(x % 10**i);
    }

    if (final > 2147483647 || final < -2147483648 ) {
        return 0;
    }

    if(isNegative){
        return -final;
    }
    else{
        return final;
    }
};

    
console.log(reverse(1534236469));
console.log(reverse(-123));
console.log(reverse(120));
console.log(reverse(0));
console.log(reverse(2,147,483,648));


0
使用递归方法反转一个数字而不将其转换为字符串。

const num = 4578;

const by10 = (num) => {
  return Math.floor(num / 10);
};
const remBy10 = (num) => {
  return Math.floor(num % 10);
};

const reverseNum = (num, str = "") => {
  if (num.toString().length == 1) return (str += num);
  return reverseNum(by10(num), (str += remBy10(num)));
};

console.log(reverseNum(num, ""));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接