Код #13 от римского до целочисленного Javascript

#javascript #if-statement #integer #conditional-statements #roman-numerals

Вопрос:

В настоящее время я пытаюсь решить вопрос «от римского к целочисленному» в Leetcode.

Мой код работает с римскими цифрами, такими как («III (3)», «V (5)», «X (10)», «C (50)») для некоторых примеров. Где мой код ломается, так это когда римские цифры, такие как («IV (4)», «IX (9)», «XL (40)»).

 let romanNum = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}  let specCases = {"IV":4, "IX":9, "XL":40, "XC":90, "CD":400, "CM":900}  arr.reduce((acc,cur,i) =gt; {  //check if it is one of the special cases  let lastTwo = ""  if (i !== 0) {  let lastTwo = arr[i-1].concat(cur)  console.log(lastTwo)  console.log(Object.keys(specCases))  console.log(typeof(lastTwo))  }  if (lastTwo in specCases) {  acc = acc - romanNum[arr[i-1]]   specCases[lastTwo]  return console.log(acc)  }  //for non-sepcial cases run the code below  acc = acc   romanNum[cur]  return acc }, 0)   

Я также включил соответствующие фрагменты кода выше. Я проверил, чтобы убедиться, что переменная «lastTwo» была назначена правильно, что доступ к ключам объектов specCases осуществлялся правильно, а typeof(lastTwo) был строкой. Все, что я проверил выше, казалось правильным.

Ниже приведена ссылка на фотографию, на которую выводится код доступа при использовании «IX»:

Оценивает до 11, когда должно быть 9

При выполнении кода второй условный оператор не выполняется, и эта часть кода не выполняется.

Почему не выполняется второе условие?

Комментарии:

1. acc = acc - arr[i-1] specCases[lastTwo] в этом нет никакого смысла. arr[i-1] это не число, вы не можете его вычесть. Я думаю, ты имеешь в виду romanNum[arr[i-1]]

2. return console.log(acc) завершает работу функции и не возвращает аккумулятор.

3. Извините, я забыл добавить фрагмент кода. Я изменил ввод строки на arr , так что это действительно существует. Независимо от этого, проблема, с которой я сталкиваюсь, заключается в том, что условие не выполняется, поэтому оно даже не доходит до этой части кода. Я отредактирую свой оригинальный пост.

4. Я знаю, что вы изменили его на массив. Но это все равно массив римских цифр, вы не можете вычесть их из аккумулятора.

5. Я понимаю эту часть. Проблема, с которой я сталкиваюсь, связана с if (lastTwo in specCases) . По какой-то причине это не запускает мое утверждение if.

Ответ №1:

Бармар ответил на этот вопрос:

Измените let lastTwo = arr[i-1].concat(cur) на lastTwo = arr[i-1].concat(cur). Вы создаете новую переменную в области действия if, а не назначаете внешнюю переменную.