Сегодня нашел задачу для перевода числа в римскую систему счисления. Как многие знают римляне не использовали отрицательных значений, ноль и дроби.
Решил задачу следующим образом:
function convertToRoman(number) {
let roman = {
"M": 1000,
"CM": 900,
"D": 500,
"CD": 400,
"C": 100,
"XC": 90,
"L": 50,
"XL": 40,
"X": 10,
"IX": 9,
"V": 5,
"IV": 4,
"I": 1
};
let result = "";
for (var i of Object.keys(roman)) {
var repeat = Math.floor(number / roman[i]);
number -= repeat * roman[i];
result += i.repeat(repeat);
}
return result;
}
//Тесты для примера
console.log(convertToRoman(100));
console.log(convertToRoman(5789));
console.log(convertToRoman(952));
console.log(convertToRoman(782));
Можно ли решить эту задачу за наименьшее количество операций?
Ответ
Решение через reduce
Выглядит не тривиально, но время исполнения в 2.5 раза быстрее при 100 повторах подряд.
function convertToRoman(number) {
return [
{ value: 1000, char: 'M' },
{ value: 900, char: 'CM' },
{ value: 500, char: 'D' },
{ value: 400, char: 'CD' },
{ value: 100, char: 'C' },
{ value: 90, char: 'XC' },
{ value: 50, char: 'L' },
{ value: 40, char: 'XL' },
{ value: 10, char: 'X' },
{ value: 9, char: 'IX' },
{ value: 5, char: 'V' },
{ value: 4, char: 'IV' },
{ value: 1, char: 'I' }
].reduce((result, currentValue) => {
while (number >= currentValue.value) {
result += currentValue.char;
number -= currentValue.value;
}
return result;
}, '');
}
//Тесты для примера
console.log(convertToRoman(100));
console.log(convertToRoman(5789));
console.log(convertToRoman(952));
console.log(convertToRoman(782));
Предлагайте свои решения, кому интересно.
Комментариев нет:
Отправить комментарий