LeetCode --- RomanToInteger、IntegerToRoman解题分析

题目描述:罗马数字转阿拉伯数字,阿拉伯数字转罗马数字,数字的范围是1~3999。

拿到这个题目,首先得明白罗马数字的书写形式及与数字的照关系,如下图所示:


所以,对于罗马数字转阿拉伯数字,可以借用map表中的<key,value>对的格式进行处理

public class Solution {
    public int romanToInt(String s) {
        char[] symbol = {'I','V','X','L','C','D','M'};
		int[] value = {1,5,10,50,100,500,1000};
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for(int i=0; i<symbol.length; i++)
			map.put(symbol[i], value[i]);		
		int len = s.length();
		int result = 0;		
		if(len < 0) return 0;
		result += map.get(s.charAt(0));
		for(int i=1; i<s.length(); i++){
			int cur = map.get(s.charAt(i));
			int pre = map.get(s.charAt(i-1));
			if(cur <= pre){
				result += cur;
			}else{
				result = result + cur - 2*pre;
			}
		}
		return result;
    }
}

同理,对于阿拉伯数字转罗马数字,考虑到如4、9、40、90、400、900的特殊性,则将这些都放在数组中,然后依次查数组即可:

class Solution {
public:
    string intToRoman(int num) {
      	if (num > 3999 || num < 1) 
		return string("The num is out of range!");

    	const int number[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    	const string symbol[] = { "M", "CM", "D", "CD", "C", "XC","L", "XL", "X", "IX", "V", "IV", "I"};
    
    	string roman;
    	for (size_t i = 0; num > 0; i++)
    	{
    		int count = num / number[i];
    		num %= number[i];
    		for (; count > 0; count--)
    			roman += symbol[i];
    	}
    
    	return roman;  
        }
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值