您的位置:首页 > 其它

[LeetCode]--13. Roman to Integer

2016-09-29 09:33 330 查看
Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

先来科普一波罗马数字吧。

大约在两千五百年前,罗马人还处在文化发展的初期,当时他们用手指作为计算工具.为了表示一、二、三、四个物体,就分别伸出一、二、三、四个手指;表示五个物体就伸出一只手;表示十个物体就伸出两只手.这种习惯人类一直沿用到今天.人们在交谈中,往往就是运用这样的手势来表示数字的.当时,罗马人为了记录这些数字,便在羊皮上画出Ⅰ、Ⅱ、Ⅲ来代替手指的数;要表示一只手时,就写成“Ⅴ”形,表示大指与食指张开的形状;表示两只手时,就画成“ⅤⅤ”形,后来又写成一只手向上,一只手向下的“Ⅹ”,这就是罗马数字的雏形。

  后来为了表示较大的数,罗马人用符号C表示一百.C是拉丁字“century”的头一个字母,century就是一百的意思.用符号M表示一千.M是拉丁字“mille”的头一个字母,mille就是一千的意思.取字母C的一半,成为符号L,表示五十.用字母D表示五百.若在数的上面画一横线,这个数就扩大一千倍.这样,罗马数字就有下面七个基本符号:Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)

  罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关.罗马数字因书写繁难,所以,后人很少采用.现在有的钟表表面仍有用它表示时数的.此外,在书稿章节及科学分类时也有采用罗马数字的.在中文出版物中,罗马数字主要用于某些代码,如产品型号等.计算机 ASCⅡ码收录有合体的罗马数字 12。

【记数方法】

  (1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;

  (2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如:Ⅷ = 8;Ⅻ = 12;

  (3)小的数字,(限于Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ = 4;Ⅸ = 9;

  (4)在一个数的上面画一条横线,表示这个数增值 1 000 倍,如:Ⅻ = 12 000 。

【组数规则】

  有几条须注意掌握;

  (1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个.

  (2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个.

  (3)V 和 X 左边的小数字只能用Ⅰ。

  (4)L 和 C 左边的小数字只能用×。

  (5)D 和 M 左 边的小数字只能用 C 。

(6)在数字上加一横表示这个数字的1000倍。

【罗马数字】

1~9: {“I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”};

10~90: {“X”, “XX”, “XXX”, “XL”, “L”, “LX”, “LXX”, “LXXX”, “XC”};

100~900: {“C”, “CC”, “CCC”, “CD”, “D”, “DC”, “DCC”, “DCCC”, “CM”};

1000~3000: {“M”, “MM”, “MMM”}.

public int romanToInt(String s) {
if (s == null || s.length() == 0) {
return 0;
}
Map<Character, Integer> m = new HashMap<Character, Integer>();
m.put('I', 1);
m.put('V', 5);
m.put('X', 10);
m.put('L', 50);
m.put('C', 100);
m.put('D', 500);
m.put('M', 1000);

int length = s.length();
int result = m.get(s.charAt(length - 1));
for (int i = length - 2; i >= 0; i--) {
if (m.get(s.charAt(i + 1)) <= m.get(s.charAt(i))) {
result += m.get(s.charAt(i));
} else {
result -= m.get(s.charAt(i));
}
}
return result;
}


另外一种表现形式

public int romanToInt1(String s) {
int ret = toNumber(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
if (toNumber(s.charAt(i-1)) < toNumber(s.charAt(i))) {
ret += toNumber(s.charAt(i)) - 2 * toNumber(s.charAt(i-1));
} else {
ret += toNumber(s.charAt(i));
}
}
return ret;
}

int toNumber(char ch) {
switch (ch) {
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;
}
return 0;
}


在网上看到整型转罗马数字,先保留着,以后遇到说不定能用上

public String intToRoman(int num) {
String[][] roman = {
{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
{"", "M", "MM", "MMM"}
};

String ret = "";
int digit = 0;
while (num != 0) {
int remain = num % 10;
ret = roman[digit][remain] + ret;
digit++;
num /= 10;
}
d343

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息