Каков наилучший способ узнать, является ли строка римским числом? - PullRequest
0 голосов
/ 26 февраля 2020

Почти во всех примерах речь идет о преобразовании римских чисел в целые. Имеет ли смысл преобразовывать одно за другим все римские числа, а затем проверять, больше ли это число чем 0?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Вы могли бы сделать что-то вроде этого ... Не красиво, но ...

public class Solution {
    public int RomanToInt(string s) {

        var total = 0;
        var currentNumber = 0;
        var lastNumber = 0;
        var lastRoman = '/';

        // Take results from 's' and iterate through chars
        foreach (var roman in s)
        {
            if (roman.Equals('I'))
            {
                currentNumber = 1;
            }
            else if (roman.Equals('V'))
            {
                currentNumber = 5;   
            }
            else if (roman.Equals('X'))
            {
                currentNumber = 10;       
            }
            else if (roman.Equals('L'))
            {
                currentNumber = 50;                 
            }
            else if (roman.Equals('C'))
            {
                currentNumber = 100;          
            }
            else if (roman.Equals('D'))
            {
                currentNumber = 500;  
            }
            else if (roman.Equals('M'))
            {
                currentNumber = 1000;
            }
            // Account for edge cases
            if (roman.Equals('V') && lastRoman.Equals('I') || roman.Equals('X') && lastRoman.Equals('I') || // I can be placed before V (5) and X (10) to make 4 and 9. 
                roman.Equals('L') && lastRoman.Equals('X') || roman.Equals('C') && lastRoman.Equals('X') || // X can be placed before L (50) and C (100) to make 40 and 90. 
                roman.Equals('D') && lastRoman.Equals('C') || roman.Equals('M') && lastRoman.Equals('C') )  // C can be placed before D (500) and M (1000) to make 400 and 900.
            {
                var subtract = currentNumber - lastNumber;                 
                total = total - lastNumber + subtract;                        
            }
            else
            {
                total = currentNumber + total;     
            }

            lastRoman = roman;
            lastNumber = currentNumber;
        }

        return total;
    }
}

Я не тестировал это подробно, но он прошел проверку leetcode некоторое время назад, когда я писал это.

2 голосов
/ 26 февраля 2020

Не уверен, что вы можете найти что-нибудь из коробки. Чтобы создать собственную функцию:

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


public static int IsRoman(string text) {
  foreach (var c in text) 
      if (!_romanMap.ContainsKey(char))
          return 0;
   return 1 
 }
...