[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”}.
另外一种表现形式
在网上看到整型转罗马数字,先保留着,以后遇到说不定能用上
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; }
相关文章推荐
- [leetcode] 13. Roman to Integer[facebook](11)
- 【Leetcode】:13. Roman to Integer 问题 in JAVA
- LeetCode 13. Roman to Integer 罗马数字转整数
- [LeetCode]13. Roman to Integer
- leetCode 13. Roman to Integer 字符串
- LeetCode 13. Roman to Integer(java)
- Leetcode 13. Roman to Integer(python)
- LeetCode 13. Roman to Integer(罗马数字转阿拉伯数字)
- 13. Roman to Integer--LeetCode Record
- Leetcode13. Roman to Integer
- leetcode 13. Roman to Integer
- leetcode-13. Roman to Integer
- 【LeetCode】(C#)13. Roman to Integer(Easy)
- leetcode_13. Roman to Integer
- LeetCode-13. Roman to Integer
- [leetcode]13. Roman to Integer
- leetcode--13. Roman to Integer
- 2017.10.21 LeetCode - 13. Roman to Integer - 28. Implement strStr()
- 【LeetCode】13. Roman to Integer (2 solutions)
- leetcode(6)13. Roman to Integer