題目描述:將羅馬數字字串轉換為整數。羅馬數字由 I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000) 七個符號組成,通常較大的符號寫在較小的符號左邊。但有六個特例使用減法原則:IV=4、IX=9、XL=40、XC=90、CD=400、CM=900。
解題思路:羅馬數字的核心規律是:如果某個符號的值小於它右邊符號的值,則該符號應該被減去(減法原則);否則應該被加上。
從右到左遍歷字串,維護一個 prev 變數記錄前一個(即右邊)符號的值。對於當前符號:若其值 < prev,則減去;否則加上。最後累計結果即為答案。
也可以從左到右遍歷:若當前符號值小於下一個符號值,則減去當前值;否則加上當前值。兩種方向都能正確處理所有情況。
時間複雜度:O(n) — 只需遍歷字串一次,n 為字串長度。由於羅馬數字最大為 3999,字串長度最多為 15,實際上接近 O(1)。
空間複雜度:O(1) — 雜湊表固定存放 7 個符號對應關係,不隨輸入規模增長。
1. Create a map: I->1, V->5, X->10, L->50, C->100, D->500, M->1000 2. Initialize result = 0, prev = 0 3. Iterate from right to left over string s: a. curr = map[s[i]] b. If curr < prev: result -= curr (subtraction rule) c. Else: result += curr (normal addition) d. prev = curr 4. Return result
方法一:從左到右遍歷(比較相鄰字元) 從左往右掃描,若當前字元的值 < 下一個字元的值,則減去當前值;否則加上當前值。時間複雜度 O(n),空間複雜度 O(1)。邏輯與從右到左等價,但實作上需要注意邊界(最後一個字元沒有「下一個」)。
方法二:字串替換預處理 先將所有減法組合(IV、IX、XL、XC、CD、CM)替換成對應整數值的特殊標記或直接累加差值,再對剩餘符號逐一加總。時間複雜度 O(n),空間複雜度 O(n)(替換後的字串)。可讀性高但效率略低,需要多次掃描字串。