2016-09-25 33 views
2

我的功能看起來是這樣的:羅馬來詮釋正確轉換在某些情況下

let romanToInt = romanNumber => { 
    if(typeof romanNumber !== 'string') throw new TypeError('Argument must be of type String'); 

    const values = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 }; 
    let sum = 0; 

    romanNumber.split('').map(n => n.toUpperCase()).forEach(n => sum = (sum >= values[n]) ? sum + values[n] : values[n] - sum); 

    return sum; 
} 

console.log(romanToInt("MCMXCVI")); 

大部分我是正確的測試輸入,但例如羅馬數字MCMXCVI,應該給我1996,而不是2216 ,這正是我所得到的。

我發現了這一點,但我不能確定如何實現:

你必須分開的,幾十,幾百,數千作爲單獨 項目。這意味着99是XCIX,90 + 9,但從不應該寫爲 作爲IC。同樣,999不能是IM,而1999不能是MIM。

+2

*「這可能與它有關」* - 是的。 CM是900,IX是9,IV是4等等。你的代碼根本不允許。 – nnnnnn

+0

@nnnnnn我的文字選擇不當。我會編輯,但我仍然不確定如何實現它。 –

+0

@尼古拉斯哈密爾頓錯了。用IX試試我的代碼。它將打印9. –

回答

1

根據你的問題,你需要迎合單獨的項目。一個簡單的方法是簡單地將值設置得更大,並尋找多個字符匹配。這是可能的,因爲只有幾個羅馬數字允許的組合。我已經把小提琴放在一起here

const values = { 
    'I': 1, 
    'V': 5, 
    'X': 10, 
    'L': 50, 
    'C': 100, 
    'D': 500, 
    'M': 1000, 
    'CM': 900, 
    'CD': 400, 
    'XC': 90, 
    'XL': 40, 
    'IX': 9, 
    'IV': 4 
}; 

let sum = 0; 

while(romanNumber.length > 0){ 
    let piece = romanNumber.substring(0,2); 
    if(values[piece]){ 
    sum += values[piece]; 
    romanNumber = romanNumber.substring(2); 
    }else if(values[piece[0]]){ 
    sum += values[piece[0]]; 
    romanNumber = romanNumber.substring(1); 
    } 
} 

return sum; 
0

您不應該希望用簡單的映射來解決問題,因爲在羅馬數字中,數字的含義取決於上下文。我想,很多情況下可以使用(與分裂和地圖,而不是你的線)類似的東西來處理:

var digits = romanNumber.split(''); 
var i = 0; 
while (i < digits.length) { 
    if (i == digits.length - 1 || values[digits[i]] >= values[digits[i+1]]) { 
     sum += values[digits[i]]; 
     i++; 
    } 
    else { 
     sum += values[digits[i+1]] - values[digits[i]]; 
     i += 2; 
    } 
} 

但我不知道它會在所有情況下工作。最好看看它是如何在現成的圖書館中實現的,也許是用於其他語言的。例如,下面是Perl的一個實現:http://search.cpan.org/~chorny/Roman-1.24/lib/Roman.pm

0

我不認爲你可以使用單線映射來實現,因爲操作取決於相鄰字符的比較。然而,用一個簡單的循環for

var chars = romanNumber.split(''); 
var sum = values[chars[chars.length - 1]]; 
for (var i = chars.length - 2; i >= 0; i--) { 
    if (values[chars[i + 1]] <= values[chars[i]]) { 
     sum += values[chars[i]]; 
    } else { 
     sum -= values[chars[i]]; 
    } 
} 

的事情是,當一個羅馬數字是值比一個其右側小,你想從和而不是相加的減它。