[Leetcode ブラシの質問] アルゴリズム: ローマ数字を整数に変換する

記事ディレクトリ

1. 問題点

ここに画像の説明を挿入

2. コードの理解

class Solution:
    def romanToInt(self, s: str) -> int:
        answer=0
        length = len(s)
        d={
    
    'I':1,'V':5,'X':10, 'L':50,'C':100, 'D':500,'M':1000}
        for i in range(length-1):
            if d[s[i+1]]>d[s[i]]:
                answer=answer-d[s[i]]
            else:
                answer=answer+d[s[i]]
        answer=answer+d[s[length-1]]
        return answer
  • ローマ数字を整数に変換する romanToInt メソッドを含む Solution クラスを定義します。
  • 変数answerを0に初期化して、変換された整数値を格納します。
  • 入力文字列 s の長さを取得し、可変長に格納します。
  • 各ローマ数字を対応する数値にマップする辞書 d を作成します。
  • for ループを使用して、s 内の各文字を最初の文字から最後から 2 番目の文字まで反復処理します。
  • 現在の文字の数値が次の文字の数値より小さい場合、答えから現在の文字の数値を減算します。
  • それ以外の場合は、現在の文字の数値に答えを追加します。
  • 最後の文字に対応する値に答えを追加すると、ローマ数字全体の変換が完了します。
  • 最終結果の回答を返します。

このコードの目的は、ローマ数字列 s をたどり、隣接する文字の大小関係に従って、対応する値を加算または減算して答えを求め、最終的に整数の形でローマ数字を取得することです。

2 番目のオプション:

class Solution:
    def romanToInt(self, s: str) -> int:
        answer = 0
        length = len(s)
        d = {
    
    'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        
        for i in range(length-1):
            if d[s[i]] < d[s[i+1]]:
                answer -= d[s[i]]
            else:
                answer += d[s[i]]
        
        answer += d[s[length-1]]
        
        return answer

再試行する:

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {
    
    
            'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
        }
        res = 0
        prev_val = 0
        
        for c in reversed(s):
            curr_val = d[c]
            if curr_val < prev_val:
                res -= curr_val
            else:
                res += curr_val
            prev_val = curr_val
        
        return res

最後のバージョン:

class Solution:
    def romanToInt(self, s: str) -> int:
        roman_values = {
    
    
            'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
        }
        res = 0
        prev_val = 0
        
        for c in reversed(s):
            curr_val = roman_values[c]
            if curr_val < prev_val:
                res -= curr_val
            else:
                res += curr_val
            prev_val = curr_val
        
        return res
  • ローマ数字を整数に変換する romanToInt メソッドを含む Solution クラスを定義します。
  • 各ローマ数字文字を対応する値にマップする辞書 roman_values を作成します。
  • 変数 res を 0 に初期化します。これは、変換された整数値を保存するために使用されます。
  • 変数 prev_val を 0 に初期化します。これは、前の文字の値を保存するために使用されます。
  • reversed() 関数を使用して、文字列 s を最後の文字から最初の文字まで逆方向に繰り返します。
  • 各文字 c について、対応する値 curr_val を取得します。
  • curr_val が prev_val より小さい場合、現在の文字によって表される値を減算する必要があることを意味するため、res から減算します。
  • それ以外の場合は、curr_val を res に追加します。
  • prev_val を現在の文字の値に更新します。
  • 最終結果 res を返します。これは整数形式のローマ数字です。

このコードの目的は、ローマ数字列 s を逆反復し、隣接する文字の大小関係に従って対応する値を res に加算または減算し、最終的に整数形式のローマ数字を取得することです。このコードは逆反復の機能を利用しており、毎回文字を比較するコンテキストを回避し、ロジックとコードの実装を簡素化します。

最終結果は次のとおりです。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/wzk4869/article/details/130734003