Обратное целое число в JavaScript

1

Я написал следующий код, чтобы отменить целое число в JavaScript. Он отлично работает, но возвращает 0 при вводе -900000. Кто-нибудь знает, что может быть неправильным?

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    var negative_number= false;
    var k;
    var new_string;
    if(x<0){
        negative_number = true;
        x=Math.abs(x);
    }
    var n = x.toString(); // convert from number to string
        // Step 1. Use the split() method to return a new array
    var splitString = n.split(""); // var splitString = "hello".split("");
    // ["h", "e", "l", "l", "o"]
    if (negative_number)
    {
        for (var i=0; i< splitString.length-1; i++)
        {
            splitString[i]=splitString[i+1];
        }
    }
    // Step 2. Use the reverse() method to reverse the new created array
    var reverseArray = splitString.reverse(); // var reverseArray = ["h", "e", "l", "l", "o"].reverse();
    // ["o", "l", "l", "e", "h"]

    // Step 3. Use the join() method to join all elements of the array into a string
    var joinArray = reverseArray.join(""); // var joinArray = ["o", "l", "l", "e", "h"].join("");
    // "olleh"
    //return joinArray;
    var number = Number(joinArray);
    if (negative_number)
        number= -Math.abs(number);
    //Step 4. Return the reversed string
    return number;
};
  • 1
    Какой смысл этого цикла? `for (var i = 0; i <splitString.length-1; i ++) {splitString [i] = splitString [i + 1]; } ???
  • 0
    что вы пытаетесь достичь точно. что вы ожидаете от этого? Кроме того, прохождение -1002 дает -2200.
Показать ещё 4 комментария
Теги:

4 ответа

2
Лучший ответ

Вам не нужно отрезать - знак из отрицательных чисел, вы уже приняли абсолютное значение как x. Снимите этот цикл, который перемещает цифры и уничтожает ваши значения.

3

Некоторые отличные ответы уже отправлены.

Я решил показать немного разные варианты:

  • Используйте "рекурсию" для обработки отрицательного случая
  • Остальная функция просто сосредоточена на положительном случае
  • Разбить каждый промежуточный расчет на свою собственную линию

Здесь фрагмент кода с комментариями, иллюстрирующий, как -123 становится -321:

function reverse(x) {
  if (x < 0) return -reverse(-x); // reverse(-123) === -reverse(123)
  var str = x.toString(); // "123"
  var strArray = str.split(""); // [ "1", "2", "3" ]
  var revArray = strArray.reverse(); // [ "3", "2", "1" ]
  var rev = revArray.join(""); // "321"
  return Number(rev);
}

console.log(reverse(-123)); // Outputs: -321
console.log(reverse(0)); // Outputs: 0
console.log(reverse(-900000)); // Outputs: -9
  • 0
    Мне нравится рекурсия здесь. Это делает его чище, чем версии Math.sign других решений.
2

Ясно одно: это гораздо сложнее, чем необходимо. Я думаю, что это будет делать то, что вы хотите:

const rev = (i) => Math.sign(i) * Number(('' + Math.abs(i)).split('').reverse().join(''))
  • 0
    Спасибо Скотт. Я на самом деле пришел из PHP фона и новичок в JavaScript. Просто учусь, решая проблемы. Но большое спасибо, так как мне нужно поработать над временем загрузки этих решений в качестве следующего шага.
  • 0
    Я думал, что обнаружил кого-то нового в языке. :-) Моя точка зрения не имеет никакого отношения ко времени загрузки или строго к размеру вашего решения. вместо этого я просто хотел отметить, что многие из техник, которые вы использовали вручную, уже встроены. Решение от @StephenQuan на самом деле показывает это более эффективно.
2

Выглядит слишком сложно. Этого должно быть достаточно:

function reverse(n) {  
  return Number(Array.from(String(Math.abs(n))).reverse().join('')) * Math.sign(n);
}

console.log(reverse(144));
console.log(reverse(-90000));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню