Integer to Roman 问题

Integer to Roman 问题

1.问题描述

Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.
题目翻译:
把给定的一个整数翻译成罗马数字,这个整数限定在1到3999范围内。

2.解题思路

这道题给的范围很巧妙,因为在1-3999这个范围内罗马数字是有规律可寻的:

{"","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"}

可以看到每一行只下标为4、5、9、的比较特殊,其他I、X、C、M分别代表1、10、100、1000,而V、L、D分别代表5、50、500,在此基础上构成了各个数值,也就是说只要能判断出这些特殊的情况,就能解决问题。但是当然这道题也可以用暴力解法,把这个整数一步步分解成个、十、百、千来分别查找技能解决问题。

3.代码实现

  1. 暴力解法
class Solution {
    public String intToRoman(int num) {
        		 String[][] c={
		            {"","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"}
		        };
		 
		 StringBuffer res = new StringBuffer();
		 int tmp= 0;
		 res.append(c[3][num / 1000 % 10]);
	     res.append(c[2][num / 100 % 10]);
	     res.append(c[1][num / 10 % 10]);
	     res.append(c[0][num % 10]);
		 return res.toString();
    }
}
  1. 利用特殊数字
class Solution {
   public String intToRoman(int num) {
         StringBuffer str = new StringBuffer();    
         String [] symbol = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};    
         int [] value = {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1};   
         for(int i=0;num!=0;i++){  
             while(num >= value[i]){//循环是为了处理重复的情况
                 num -= value[i];  
                 str.append(symbol[i]);  
             }  
        }  
       return str.toString();  
   }
}
posted @ 2017-09-13 16:47  流泉滴沙  阅读(150)  评论(0编辑  收藏  举报