Integer to Roman

来源:互联网 发布:梅宏 大数据系统软件 编辑:程序博客网 时间:2024/06/17 16:30

1.题目

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

科普了一下表达方式,理解了就不复杂了。I = 1;
V = 5;
X = 10;
L = 50;
C = 100;
D = 500;
M = 1000;

2.算法

算法一,直接打表,然后就是贪心的做法,每次选择能表示的最大值,把对应的字符串连起来。

public String intToRoman(int num) {String str;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 += symbol[i];}}return str;}

算法二:只要搞清楚每个数字在每个位置应该如何表示就可以,罗马数字对于每个位有三个单位:1,5,10,对于1到9,表示方法如下:
1-3:用1表示;
4:1:5左边加一个1;
5: 直接用5表示; 
6-8: 5右边加相应的1;
9: 10左边加一个1。
以下的代码用一个函数来对某一个位用相应的1,5,10进行转换,然后求出每一位依次转换得到结果,因为知道不会超过4000,所以直接求4位出来,算法时间复杂度是O(整数的位数),空间复杂度是O(1)。

public String intToRoman(int num) {    if(num<1 || num>3999)          return "";      int digit = 1000;      ArrayList<Integer> digits = new ArrayList<Integer>();      while(digit>0)      {          digits.add(num/digit);          num %= digit;          digit /= 10;      }      StringBuilder res = new StringBuilder();      res.append(convert(digits.get(0),'M',' ', ' '));      res.append(convert(digits.get(1),'C','D', 'M'));      res.append(convert(digits.get(2),'X','L', 'C'));      res.append(convert(digits.get(3),'I','V', 'X'));      return res.toString(); }//找到数子所对应的位置public String cover(int digit, char one, char five, char ten){StringBuilder str = new StringBuilder();switch (digit) {case 9:str.append(one);str.append(ten);break;case 8:case 7:case 6:case 5:str.append(five);for (int i = 5; i < digit; i++){str.append(one);}break;case 4:str.append(one);str.append(five);break;case 3:case 2:case 1:for (int i = 1; i <= digit; i++){str.append(one);}break;default:break;}return str;}


0 0
原创粉丝点击