整数转罗马数字,这道题目对我们中国人来说是很郁闷的,因为不熟悉。但确实也有面试官考,所以复习一下。首先罗马数字的定义参见: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; } };