从罗马数字转换到阿拉伯数字


使用JavaScript | Python | Java | C++解决从罗马数字转换到阿拉伯数字_javascript

问题描述:

罗马数字是由七个不同的符号表示:​​I​​​,​​V​​​,​​X​​​,​​L​​​,​​C​​​,​​D​​​和​​M​​。

Symbol(标记)

Value (值)

I

1

V

5

X

10

L

50

C

100

D

500

M

1000

例如,​​2​​​用罗马数字​​II​​​书写,只是将两个​​I​​​加在一起。​​12​​​作为写​​XII​​​,这是用​​X + II​​​。数字​​27​​​写为​​XXVII​​​,即​​XX + V + II​​。

罗马数字通常从左到右从大到小书写。但是,四的数字不是​​IIII​​​。而是将数字四写为​​IV​​​。因为一个在​​五​​​之前,所以我们减去它等于​​四​​​。相同的原理适用于数字​​9​​​,记为​​IX​​。在六种情况下使用减法:


  • ​I​​​可以放在​​V(5)​​​和​​X(10)​​​之前制作​​4​​​和​​9​​。
  • ​X​​​可以放在​​L(50)​​​和​​C(100)​​​之前制作​​40​​​和​​90​​。
  • ​C​​​可以放在​​D(500)​​​和​​M(1000)​​​之前制作​​400​​​和​​900​​。

给定罗马数字,将其换为整数。

例子:

范例1:

输入:

s =“ III”

输出:

3

范例2:

输入:

s =“ IV”

输出:

4

范例3:

输入:

s =“ IX”

输出:

9

范例4:

输入:

s =“LVIII”

输出:

58

解释:

L = 50,V = 5,III = 3。

范例5:

输入:

s =“ III”

输出:

3

解释:

M = 1000, CM = 900, XC = 90 and IV = 4

限制条件:


  • 1 <= s.length <= 15
  • s仅包含字符(‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)。
  • 确保s范围内的有效罗马数字[1, 3999]。

解决思路:

(跳至:问题描述||代码:JavaScript | Python | Java | C ++)

关于罗马数字计数的唯一真正棘手的事情是,数字被用作减值而不是加值。在“IV”,例如,值“I”,1,从的值中减去“V”,5。否则,您只需将所有数字的值相加即可。

关于减号,我们应该意识到的一件事是它们是可识别的,因为它们出现在较大的数字之前。这意味着迭代罗马数字的更简单方法是从右到左,以帮助进行识别过程。

因此,在这里要做的一件简单的事情是向后遍历S,查找每个字母的值,然后将其添加到我们的答案(ans)中。如果我们遇到的字母值小于到目前为止所看到的最大字母值,则应减去而不是加。

标准方法是使用一个单独的变量来跟踪看到的最高值,但是这里有一个更简单的技巧。由于数字通常以罗马数字符号从右到左增加,因此任何减数也必须小于我们当前的ans

因此,我们可以在这里避免使用额外的变量。我们确实遇到了重复数字导致问题的情况(即“III”),但是我们可以通过将num乘以24之间的任意数字,然后再将其与ans进行比较来清除它,因为数字在数值上的跃迁为至少5倍

一旦我们知道如何正确识别减数,就可以简单地向后迭代S来查找并返回ans

执行代码:

Javascript和Python都可以非常快速地使用对象/区分对象进行操作,因此我们将使用查找表来获取罗马数字值。

Java和C ++都不处理对象,因此我们将使用切换用例以相同的方式工作。

JavaScript代码:

(跳至:​​问题描述​​​||​​解决思路​​)

const roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}

var romanToInt = function(S) {
let ans = 0
for (let i = S.length-1; ~i; i--) {
let num = roman[S.charAt(i)]
if (4 * num < ans) ans -= num
else ans += num
}
return ans
};

Python代码:

(跳至:​​问题描述​​​||​​解决思路​​)

roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}

class Solution:
def romanToInt(self, S: str) -> int:
ans = 0
for i in range(len(S)-1,-1,-1):
num = roman[S[i]]
if 4 * num < ans: ans -= num
else: ans += num
return ans

Java代码:

(跳至:​​问题描述​​​||​​解决思路​​)

class Solution {
public int romanToInt(String S) {
int ans = 0, num = 0;
for (int i = S.length()-1; i >= 0; i--) {
switch(S.charAt(i)) {
case 'I': num = 1; break;
case 'V': num = 5; break;
case 'X': num = 10; break;
case 'L': num = 50; break;
case 'C': num = 100; break;
case 'D': num = 500; break;
case 'M': num = 1000; break;
}
if (4 * num < ans) ans -= num;
else ans += num;
}
return ans;
}
}

C++代码:

(跳至:​​问题描述​​​||​​解决思路​​)

class Solution {
public:
int romanToInt(string S) {
int ans = 0, num = 0;
for (int i = S.size()-1; ~i; i--) {
switch(S[i]) {
case 'I': num = 1; break;
case 'V': num = 5; break;
case 'X': num = 10; break;
case 'L': num = 50; break;
case 'C': num = 100; break;
case 'D': num = 500; break;
case 'M': num = 1000; break;
}
if (4 * num < ans) ans -= num;
else ans += num;
}
return ans;
}
};

欢迎关注作者公众号【海拥】

保存或者长按识别

使用JavaScript | Python | Java | C++解决从罗马数字转换到阿拉伯数字_java_02

后面我还会持续更新类似免费好玩的H5小游戏、Java小游戏、好玩、实用的项目和软件等等