Перевод римской системы с целочисленной

#13.Roman to Integer

Постановка задачи

Римские цифры представлены семью различными символами: 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.

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

Дано римское число, преобразуйте его в целое число.

Пример 1

Input: s = "III"
Output: 3
Explanation: III = 3.
Вход в полноэкранный режим Выход из полноэкранного режима

Пример 2

Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Войти в полноэкранный режим Выход из полноэкранного режима

Пример 3

Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Войти в полноэкранный режим Выход из полноэкранного режима

Пояснение

給定一個羅馬數字將其轉換成阿拉伯數字,羅馬數字通常會從左到右,由大到小來撰寫,但有一特性,數字 4 不寫成 IIII 而是 IV,因為 45 之前,所以用 V 減去一個 I 得到 IV 也就是等於 4

相同原則下也是適用於 9,轉換成羅馬數字為 IX,題目也提供了六種使用這種減法的案例。

Решение

  • 先過濾特定條件,判斷字串 s 是否為空字串或是 null,如果成立則返回 0
  • 接著將羅馬符號對應的數字分別裝進 Dictionary 供後續轉換使用
  • 建立一個 counter 變數儲存加總,並先 assign s0 個索引轉換後的值
  • 迴圈走訪字串內的從所有字符(除了第一個字),用一個 If Statements 來判斷是加法還是減法,正常原則是由大到小,所以條件可設為這次的羅馬符號大於上次則為減法
    • 條件成立:加總這次轉換的數值
    • 條件不成立:邏輯是減去上次加總的,再加上這次的數值減去上次的數值
  • 最後返回結果 счетчик
public int RomanToInt(string s)
{
    if (s == null || s == String.Empty)
        return 0;

    IDictionary dic = new Dictionary<char, int>
    {
        { 'I', 1 },
        { 'V', 5 },
        { 'X', 10 },
        { 'L', 50 },
        { 'C', 100 },
        { 'D', 500 },
        { 'M', 1000 }
    };

    int counter = (int)dic[s[0]];

    for (int i = 0; i < s.Length; i++)
    {
        if ((int)dic[s[i - 1]] >= (int)dic[s[i]])
            counter += (int)dic[s[i]];
        else
        {
            counter += (int)dic[s[i]] - (int)dic[s[i - 1]] * 2;
        }
    }

    return counter;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Ссылка

Решение LeetCode

Репозиторий GitHub


Спасибо, что прочитали статью 🌷 🌻 🌼

Если вам понравилось, пожалуйста, не стесняйтесь нажать на кнопку сердечко ❤️
или нажмите like на моем решении Leetcode
или следите за моим GitHub ⭐
или купите мне кофе ⬇️ Я буду благодарен.


Оцените статью
devanswers.ru
Добавить комментарий