算法题019 -- [Roman to Integer] by java

题目

给定罗马数字,将其转换为整数。
输入保证在1到3999的范围内。

举例
//	·个位数举例
//	I-1、II-2、III-3、IV-4、Ⅴ-5、VI-6、VII-7、VIII-8、Ⅸ-9
//	·十位数举例
//	Ⅹ-10、XI-11、XII-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
//	·百位数举例
//	C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
//	·千位数举例
//	M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999

分析

  • 罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。
    • 记数的方法:
    • 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
    • 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
    • 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
    • 在一个数的上面画一条横线,表示这个数增值 1,000 倍,如 =5000。(这个规则应该是用不到了,因为实在不知道怎么打出上划线)

无非就是相邻两个数比较,考察的是代码功底。

代码

package algorithm019;

import java.util.HashMap;

public class Algorithm019 {
	
//	·个位数举例
//	I-1、II-2、III-3、IV-4、Ⅴ-5、VI-6、VII-7、VIII-8、Ⅸ-9
//	·十位数举例
//	Ⅹ-10、XI-11、XII-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
//	·百位数举例
//	C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
//	·千位数举例
//	M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999

	public static void main(String[] args) {
		romanToInt("MDC");
	}
	
	public static int romanToInt(String roman) {
		char[] chars = roman.toCharArray();
		HashMap<Character, Integer> map = getRomanMap();
		if(chars.length == 1)
			return map.get(chars[0]);
		int sum = 0;
		for(int pos=0; pos<chars.length; pos++) {
			if(pos <= chars.length -2 && (map.get(chars[pos]) < map.get(chars[pos+1]))) {
				sum += (map.get(chars[pos+1]) - map.get(chars[pos]));
				pos++;
			}else {
				sum += map.get(chars[pos]);
			}
		}
		System.out.println(sum);
		return sum;
	}
	
	public static HashMap<Character, Integer> getRomanMap(){
		HashMap<Character, Integer> map = new HashMap<Character, Integer>();
		map.put('I', 1);
		map.put('X', 10);
		map.put('C', 100);
		map.put('M', 1000);
		map.put('V', 5);
		map.put('L', 50);
		map.put('D', 500);
		return map;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值