[leetcode]Integer to Roman

整数转罗马数字,这道题目对我们中国人来说是很郁闷的,因为不熟悉。但确实也有面试官考,所以复习一下。首先罗马数字的定义参见:http://baike.baidu.com/link?url=aDx5F_QUGwk0DIbgeLxvu0YX1RDUjETI67bdJSaNxDcWCdpZVK_DH_54IIq7Z-w-

可以看到,其实就是1~9的循环表示,用不同的字符集。那么比较容易想到的就是下面这个方法。

public class Solution {
    public String intToRoman(int num) {
        char[] roman = new char[] {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
        StringBuilder sb = new StringBuilder();
        int scale = 1000;
        for (int i = 6; i >= 0; i -= 2)
        {
            if (num == 0) break;
            int c = num / scale;           
            if (c <= 3)
            {
                for (int j = 0 ; j < c; j++)
                {
                    sb.append(roman[i]);
                }
            }
            else if (c == 4)
            {
                sb.append(roman[i]);
                sb.append(roman[i+1]);
            }
            else if (c == 5)
            {
                sb.append(roman[i+1]);
            }
            else if (c <= 8)
            {
                sb.append(roman[i+1]);
                for (int j = 0 ; j < c-5; j++)
                {
                    sb.append(roman[i]);
                }
            }
            else if (c == 9)
            {
                sb.append(roman[i]);
                sb.append(roman[i+2]);
            }
            num = num - c * scale;
            scale = scale / 10;
        }
        return sb.toString();
    }
}

除此之外,还看到这么一个方法,比较巧妙需要思考一下。其实就是从大到小试探可能性,比如拿10以内的举例:10,9,5,4,1都是坎。到不了这一级,就只能下一个,比如8,到不了9,就先放个5,剩下的3也到不了4,就只能用1来表示。

class Solution {
public:
    string intToRoman(int num) {
        string res;        
        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};
        
	    int i = 0;
	    while(num != 0){
		    if(num >= value[i]){    // minus largest number
			    num -= value[i];
		    	res += symbol[i];
		    } else {
    	        i++;   
		    }
	    }
	    return res;
    }
};

  

posted @ 2013-08-29 23:49  阿牧遥  阅读(237)  评论(0编辑  收藏  举报