leetcode - Roman to Integer 与 Integer to Roman

leetcode题目汇集  — Roman与Integer之间的互换

参考网址https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97

Roman To Integer

搬运维基百科对罗马数字性质的介绍:

右加左减:

  • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
  • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
  • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
  • 但是,左减时不可跨越一个位值。比如,99不可以用IC({\displaystyle 100-1}100-1)表示,而是用XCIX({\displaystyle [100-10]+[10-1]}[100-10]+[10-1])表示。(等同于阿拉伯数字每位数字分别表示。)
  • 左减数字必须为一位,比如8写成VIII,而非IIX。
  • 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)
因此,首先判断左侧的数值是否小于右侧的数值,如果小于,则用右侧的数值减去左侧的数值,并右移2位;否则,依次相加即可。

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


Integer To Roman:

将需要特殊处理的数字单独罗列出来,并用num一一比较,依次相加即可。

考虑到最终的结果result需要多次进行拼接,如果追求效率的话,可以考虑用StringBuilder,最后转换成String即可。

下面的代码直接使用的String,最好使用StringBuilder

public class Solution {
  public String intToRoman(int num) {
    int[] nums = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    String[] romans = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
    int index = 0;
    int count = 0;
    String result = "";
    while (num > 0) {
      count = num / nums[index];
      for (int i = 0; i < count; i++) {
        result += romans[index];
        num -= nums[index];
      }
      index++;
    }
    return result;
    
  }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值