😊 😃 😀 Ave, laicorum conservis !!!🙋‍♂️ 🙋‍♀️🙋

😡 Quid est hoc ineptias !!! 😡

Введение

Привет, товарищ читатель! Застряли на этой сложной проблеме LeetCode среднего уровня? Не беспокойтесь, давайте рассмотрим эту подсказку вместе с простым, но эффективным процессом. Сначала мы прочитаем подсказку и приведенные примеры, сделаем заметки о том, что мы поняли, и запишем любые подсказки, которые найдем. Затем, используя наши заметки, создайте решение, которое пройдет все тесты. Этот процесс должен помочь нам понять то, что мы, кажется, не можем понять.

Имейте в виду, что я буду решать эту проблему среднего уровня в JavaScript. Тем не менее, я призываю вас продолжать читать. Идея в том, что вы можете ВСЕ ЕЩЕ извлечь что-то из этого чтения. Эти задачи предназначены для проверки наших логических и аналитических способностей, а не столько синтаксиса.

Подсказка и примеры

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
— — — — — — — — — — — — — — — — — — — — — —
Symbol Value
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
— — — — — — — — — — — — — — — — — — — — — —
For example, 2 is written as II in Roman numeral, just two one’s added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
- I can be placed before V (5) and X (10) to make 4 and 9.
- X can be placed before L (50) and C (100) to make 40 and 90.
- C can be placed before D (500) and M (1000) to make 400 and 900.
Given an integer, convert it to a roman numeral.

Пример 1:

Input: num = 3
Output: “III”

Пример 2:

Input: num = 4
Output: “IV”

Пример 3:

Input: num = 9
Output: “IX”

Пример 4:

Input: num = 58
Output: “LVIII”
Explanation: L = 50, V = 5, III = 3.

Пример 5:

Input: num = 1994
Output: “MCMXCIV”
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

Разбираем

О боже, похоже, эта проблема предназначена для этих придурков-разработчиков и истории 🤓, верно? … Ээээ, не совсем. Помните, какой бы пугающей ни казалась проблема, для нее есть несколько решений. Природа этих вопросов призвана застать нас врасплох 🗡 🛡 . Пожалуйста, не теряйте самообладания по этому поводу; есть разумное решение в нашей досягаемости. Найдите шаблоны 🕵️‍♀️ 🕵️‍♂️🕵️ , подумайте о том, что вы уже узнали. Коллективные знания + опыт, это ваш лучший инструмент 🔨!

Римские цифры представлены семью различными символами: I, V, X, L, C, D и M.

Круто, семь разных символов. Все они уникальны.

Symbol Value
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000

Для этого есть решение. Легко разочароваться в прочитанном.

Оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо. Это определенно выглядит полезным. Вероятно, вы могли бы хранить эти значения в массиве или объекте.

Например, 2 записывается как II римскими цифрами, всего две сложенные вместе.12 записывается как XII. >, то есть просто X + II. Число 27 записывается как XXVII, то есть XX + V + II.

Теперь это становится более интенсивным. Видишь узор? Мы должны построить число из заданных символов. Было бы лучше, если бы вы также использовали символы больших значений. В противном случае 12 выглядело бы так… «IIIIIIIIIIII. “ Не очень эффективно или приятно читать, не так ли?

Number … Roman Number
2 … II
12 … X + II
27 … X + X + V + II

Запишем эту мысль. Это кажется полезным.

Римские цифры обычно пишутся слева направо от большего к меньшему. Однако цифра четыре не IIII. Вместо этого цифра четыре записывается как IV. Поскольку единица предшествует пятерке, мы вычитаем ее и получаем четыре. Тот же принцип применим к числу девять, которое пишется как IX. Есть шесть случаев, когда используется вычитание:

- I can be placed before V (5) and X (10) to make 4 and 9.
- X can be placed before L (50) and C (100) to make 40 and 90.
- C can be placed before D (500) and M (1000) to make 400 and 900.
Given an integer, convert it to a roman numeral.

Попался… мы строим наш номер слева направо. Тем не менее, писать такие числа, как четыре, интересно. Мы пишем, по сути, пишем математическую задачу. 1– 5 = 4 или то, что предшествует 4. Странно ️🤷‍♂️ , но я уверен, что на это есть веская причина.

Давайте также запишем 6 примеров этого принципа. Кроме того, давайте посмотрим на диаграмму, которую они нам дали.

Symbol Value           Number of Instances
I      1
V      5 ← 1–5 = IV    (1)
X      10 ← 1–9 = IX   (2)
L      50 ← …
C      100
D      500
M      1000

Интересно… Итак, учитывая последнюю часть этого текста…

- I can be placed before V (5) and X (10) to make 4 and 9.
- X can be placed before L (50) and C (100) to make 40 and 90.
- C can be placed before D (500) and M (1000) to make 400 and 900.
Given an integer, convert it to a roman numeral.

У нас должны быть все 6 экземпляров, упомянутых в подсказке.

Symbol Value             Number of Instances
I =    1
V  =   5 ← 1–5 =         IV ………(1)
X  =   10 ← 1–9 =        IX ………(2)
L  =   50 ← 10–50 =      XL …..(3)
C  =   100 ← 10–100 =    XC …(4)
D  =   500 ← 100–500 =   CD…(5)
M  =   1000 ← 100–1000 = CM.(6)

Давайте обновим нашу диаграмму. Мы добавим в него наши 6 кейсов. Это должно иметь больше смысла…

Symbol = Value
I   = 1
IV  = 4 ← 
V   = 5
IX  = 9 ←
X = 10
XL = 40 ←
L =  50
XC = 90 ←
C = 100
CD = 400 ←
D = 500
CM = 900 ←
M = 1000

Круто, это должно пригодиться позже. Давайте закончим и посмотрим на эти примеры. Часто мы можем найти в них интересные идеи. Это также хороший способ проверить собственные рассуждения. Мы не хотим тратить время на неверный ход мыслей. 🚂

Пример 1:

Input: num = 3
Output: “III”

Это имеет смысл, когда мы смотрим на диаграмму, которую мы только что обновили.

Пример 2:

Input: num = 4
Output: “IV”

Да, это хорошо проверяется!

Пример 3:

Input: num = 9
Output: “IX”

Пример 4:

Input: num = 58
Output: “LVIII”
Explanation: L = 50, V = 5, III = 3.

Учитывая символы на только что обновленном графике, это имеет смысл. Опять же, мы делаем число с символами, которые нам даны. Самые большие символы находятся слева, а самые маленькие — справа. 👍

Пример 5:

Input: num = 1994
Output: “MCMXCIV”
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

Вот это большое число! Опять же, как и прежде, мы видим от крупной до мелкой организации символов. Здесь мы также используем наш принцип. Это логика IV = 4, о которой мы читали ранее. Круто 😎 , Пока нет серьезных проблем или противоречий с нашим мышлением! Давайте посмотрим на наши заметки; затем мы начнем строить решение.

History Note 🧮 : Romans didn’t have negative numbers. To be blunt things were done differenty. So we need to think like a roman, thus it IV is actually 4 NOT -4. Kind of esoteric, but you should see how the Sumerians counted 😜😝😛!

Примечания и подсказки

Давайте посмотрим, что у нас есть на данный момент…

  • Входные данные: число, что более важно, целое число.
  • Вывод:строка римских цифр.
  • Целое число = ЦЕЛЫЕ ЧИСЛА,которые могут быть положительными или отрицательными.
  • примеры не показывают отрицательных чисел. Не будем о них беспокоиться.
  • Семь различных символов:I, V, X, L, C, D и M.
  • шестьпримеров данного принципа подсчета
  • Воспользуйтесь как-нибудь обновленной схемой!
  • Собери число с заданными символами 🔨
  • Используйте символы с большими значениями.
  • Стройте от большего к меньшему слева направо.

Написание кода

Списать битой. Я могу сказать вам, что у нас есть твердый верхний предел/граница для этой проблемы. Причина в том, что наши символы и числа не будут увеличиваться в размерах при масштабировании! Это дает нам хорошее пространство для маневра.

Давайте начнем с определения наших значений и символов. Я хочу выбрать для этого массивы, так как к ним легко получить доступ, а размер не увеличивается и не уменьшается. Поскольку мы имеем дело с элементами HARD-CODED, возможно, мы можем что-то сделать с длиной…

const intToRoman = function(num) {
const values = [
1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
] < 📏 Has length of 13 📐

Теперь сделаем еще один, содержащий только символы.

const intToRoman = function(num) {
const values = [
1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
] < 📏 Same length 📐
const symbols = [
“M”,”CM”,”D”,”CD”,”C”,”XC”,”L”,”XL”,”X”,”IX”,”V”,”IV”,”I”
] < 📏 Same length 📐

Эй, эти символы и значения представляют собой массивы одинаковой длины! Это действительно полезно. Имейте это в виду!

let result = ‘’;

Давайте поговорим о выводе. Нам нужно вернуть строку с некоторой комбинацией символов в нашем массиве. Пусть переменная установлена ​​в пустую строку. Мы будем использовать это, чтобы вернуть наш ответ, как только наша предоставленная функция завершит работу. 🏃‍♀️ 🏃‍♂️ 🏃

for(let i = 0; i < values.length; i++) {
*stuff in here*
}

В качестве входных данных нам дается число, которое называется num. Нам также потребуется использовать цикл для построения наших символов на основе заданного числа.

На данный момент у нас есть выбор; что повторяем? Должен ли это быть ввод (который является числом) или наши массивы? Давайте задумаемся об этом на секунду и подумаем творчески.

Наш заданный ввод может быть любого размера; таким образом, любая итерация по числу может работать. Глядя на ограничения внизу, самое большое число, которое мы получаем, — это 4 разряда. Определенно вариант, но мне он не поет. Давайте посмотрим на другие варианты.

Ограничение:

  • 1 ‹= число ‹= 3999

Наш массив символов не имеет никакого отношения к нашему входу, так что это исключено. Это оставляет нас с нашим массивом чисел, называемым «значения», возможно, проверяя, можем ли мы вычесть число из массива из заданного числа/ввода.

Мы также можем сохранить символ, основанный на этом значении, в нашей возвращаемой переменной под названием «results». Хммм… Давайте попробуем!

Давайте воспользуемся старым добрым циклом for…

History Note 🧮 : Romans didn’t have zeroes either. Since they followed Ancient Greek reasoning, the idea of having nothing made no sense. Thus it’s reflected in there counting system. Don’t get me started on irrational numbers either… 👊 🥋 🤺

О, хорошо, в таком случае у нас будет пограничный случай, о котором нужно беспокоиться! Кроме того, наша диаграмма также не имеет нулевого значения. Давайте изменим наш цикл for, чтобы отразить это.

… for(let i = 0; i < values.length && num > 0; i++) {
*stuff in here*
} …

Посмотрите, как мы перебираем наши значения, которые представляют собой массив чисел. 👀

for(let i = 0; i < values.length && num > 0; i++) {
while(values[i] <= num) {
}

Теперь давайте сравним каждое значение с данным num/input. Для этого воспользуемся циклом while. Мы хотим, чтобы он прерывался, когда наше число из массива или value[i] МЕНЬШЕ введенного нами числа.

for(let i = 0; i < values.length && num > 0; i++) {
   while(values[i] <= num) {
      *stuff in here*
   }
}

Прохладный. Итак, идея заключается в том, что мы вычитаем значение из ввода и добавляем символ, представляющий это значение, в нашу переменную result. Это работает, потому что:

  1. Наши символы и значения имеют одинаковую длину.
  2. Они расположены в порядке возрастания (счёт вверх).
for(let i = 0; i < values.length && num > 0; i++) {
    while(values[i] <= num) {
       num -= values[i];
       result += symbols[i]
    }
}

Пока все выглядит хорошо, давайте вернем эту результирующую переменную вне комбинации цикла while + цикла for. Все тесты должны пройти!

Решение

const intToRoman = function(num) {
const values = [
1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
]
const symbols = [
“M”,”CM”,”D”,”CD”,”C”,”XC”,”L”,”XL”,”X”,”IX”,”V”,”IV”,”I”
]
let result = ‘’;
for(let i = 0; i < values.length && num > 0; i++) {
while(values[i] <= num) {
num -= values[i];
result += symbols[i]
   }
  }
  return result
};

Заключение

Довольно простое решение. Чисто и легко читается, но обратите внимание, сколько времени мы потратили на решение проблемы. Это очень важно при решении таких пугающих проблем, как эта. Знание римских цифр — это плюс, но в основном это связано с нашей способностью делать выводы и тем, что мы уже знаем.

Со временем что-то получится, но процесс здесь так же важен, как и чистое решение. Придерживайтесь надежного подхода, который не позволит вам вернуться к тексту, изолируйте то, что вас сбивает с толку, и углубитесь в него. Это все целевая практика, но она бесполезна, если вы не до конца понимаете, что вас сбивает с толку. Удачного кодирования! 😆 ⌨️ 🐁

Крутые ссылки здесь

leetcode: www.leetcode.com
Roman Numerals: https://en.wikipedia.org/wiki/Roman_numerals
Roman Negative Numbers & Zero: https://www.quora.com/Are-there-negative-Roman-Numerals