다트에서 로마자를 정수로 - Leetcode

로마에서 정수로



접근하다


  • 로마 기호 및 해당 정수로 지도를 유지 관리 - 이미 질문
  • 에 제공됨
  • 문자열을 오른쪽에서 왼쪽으로 스캔합니다. 맵에서 현재 문자에 ​​해당하는 값을 가져와 결과에 추가합니다
  • .
  • 특별한 경우는 값이 현재 문자에 ​​해당하는 값보다 작은 현재 문자의 왼쪽에 있는 문자입니다. 예를 들어 x는 10을 나타내지만 IX는 9를 나타냅니다. 이 경우 결과에서 왼쪽 문자의 값을 뺍니다
  • .

    암호



    두 솔루션 모두 완벽하게 괜찮지만 첫 번째 패스는 비행 색상으로, 다른 하나는 치명적이고 가장 성가신 오류로 끝납니다. while 루프가 손상되었거나 leetCode 플랫폼에서 제대로 실행될 수 있다고 생각하거나 믿게 됩니다.

    간단한 솔루션




    
    class Solution {
      int romanToInt(String s) {
        Map<String, int> romanMap = <String, int>{
          "I": 1,
          "V": 5,
          "X": 10,
          "L": 50,
          "C": 100,
          "D": 500,
          "M": 1000,
        };
        int n = s.length;
        var nums = romanMap[s[n - 1]];
        for (var i = n - 2; i >= 0; i--) {
          if (romanMap[s[i]]! >= romanMap[s[i + 1]]!) {
            if (nums != null) {
              nums += romanMap[s[i]]!;
            }
          } else {
            if (nums != null) {
              nums -= romanMap[s[i]]!;
            }
          }
        }
        return nums!;
      }
    }
    
    
    


    런타임: 841ms, Roman to Integer에 대한 Dart 온라인 제출의 88.89%보다 빠릅니다.
    메모리 사용량: 149.6MB, Roman to Integer에 대한 Dart 온라인 제출물의 66.67% 미만.

    알고리즘 솔루션




    
    class Solution {
      int romanToInt(String s) {
        int getInt(String s) {
          switch (s) {
            case "I":
              return 1;
            case "V":
              return 5;
            case "X":
              return 10;
            case "L":
              return 50;
            case "C":
              return 100;
            case "D":
              return 500;
            case "M":
              return 1000;
    
            default:
              -1;
          }
          return 0;
        }
    
        int n = s.length;
        int result = 0;
        int current = 0;
        int next = 0;
        int i = 0;
    
        while (i < n) {
          if (i == n - 1) {
            result += getInt(s[i]);
            return result;
          }
          current = getInt(s[i]);
          next = getInt(s[i + 1]);
          if (current >= next) {
            result += current;
            i++;
          } else {
            result += next - current;
            i += 2;
          }
        }
    
        return result;
      }
    }
    
    


    오류



    제출 세부 사항
    64/3999 테스트 케이스 통과.
    상태: 시간 제한 초과
    마지막으로 실행된 입력: "MCXXV"

    좋은 웹페이지 즐겨찾기