exercism————Roman Numerals

题目:

在这里插入图片描述

解法一:

package exercism;

import org.omg.PortableInterceptor.INACTIVE;

import java.util.HashMap;
import java.util.Map;

/**
 * 	右加左减
 * 	左减数字必须为一位且仅限于Ⅰ、Ⅹ、Ⅽ ,右加数字不能超过三位
 *  转换3000以内就可以了
 */

public class RomanNumerals {
	private String romanNumber;

	public RomanNumerals(int num) {
		StringBuilder result = new StringBuilder();
		int digit = (num % 10);
		int tens = (num % 100 / 10) * 10;
		int hundreds = (num % 1000 / 100) * 100;
		int thousands = (num / 1000) * 1000;

		result.append(getTheThousands(thousands));
		result.append(getTheHundreds(hundreds));
		result.append(getTheTens(tens));
		result.append(getDigit(digit));

		this.romanNumber = result.toString().replaceAll("null","");
	}

	public String getDigit(int digit) {
		Map<Integer,String> digitMap = new HashMap<>(9);
		digitMap.put(1,"I");
		digitMap.put(2,"II");
		digitMap.put(3,"III");
		digitMap.put(4,"IV");
		digitMap.put(5,"V");
		digitMap.put(6,"VI");
		digitMap.put(7,"VII");
		digitMap.put(8,"VIII");
		digitMap.put(9,"IX");
		return digitMap.get(digit);
	}

	public String getTheTens(int tens) {
		Map<Integer,String> tensMap = new HashMap<>(9);
		tensMap.put(10,"X");
		tensMap.put(20,"XX");
		tensMap.put(30,"XXX");
		tensMap.put(40,"XL");
		tensMap.put(50,"L");
		tensMap.put(60,"LX");
		tensMap.put(70,"LXX");
		tensMap.put(80,"LXXX");
		tensMap.put(90,"XC");

		return tensMap.get(tens);
	}

	public String getTheHundreds(int theHundreds) {
		Map<Integer,String> hundredsMap = new HashMap<>();
		hundredsMap.put(100,"C");
		hundredsMap.put(200,"CC");
		hundredsMap.put(300,"CCC");
		hundredsMap.put(400,"CD");
		hundredsMap.put(500,"D");
		hundredsMap.put(600,"DC");
		hundredsMap.put(700,"DCC");
		hundredsMap.put(800,"DCCC");
		hundredsMap.put(900,"CM");

		return hundredsMap.get(theHundreds);
	}

	public String getTheThousands(int theThousands) {
		Map<Integer,String> thousandsMap = new HashMap<>();
		thousandsMap.put(1000,"M");
		thousandsMap.put(2000,"MM");

		return thousandsMap.get(theThousands);
	}
}

解法二:

import java.util.Map;
import java.util.LinkedHashMap;

public class RomanNumeral {

    private int arabicNumeral;
    private static final Map<Integer, String> conversion = new LinkedHashMap<>();
    static {
        conversion.put(1000, "M");
        conversion.put(900, "CM");
        conversion.put(500, "D");
        conversion.put(400, "CD");
        conversion.put(100, "C");
        conversion.put(90, "XC");
        conversion.put(50, "L");
        conversion.put(40, "XL");
        conversion.put(10, "X");
        conversion.put(9, "IX");
        conversion.put(5, "V");
        conversion.put(4, "IV");
        conversion.put(1, "I");
    }

    public RomanNumeral(int arabicNumeral) {
        this.arabicNumeral = arabicNumeral;
    }

    public String getRomanNumeral() {
        String romanNumeral = "";

        for (int currentValue : conversion.keySet()) {
            while (this.arabicNumeral >= currentValue) {
                romanNumeral += conversion.get(currentValue);
                this.arabicNumeral -= currentValue;
            }
        }

        return romanNumeral;
    }
}

解法三:

public class RomanNumeral {
    private final int number;

    public RomanNumeral(int i) {
        number = i;
    }

    String getRomanNumeral() {
        String duizendtallen = new String[]{"", "M", "MM", "MMM"}[number / 1000];
        String honderdtallen = new String[]{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}[(number % 1000) / 100];
        String tientallen = new String[]{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}[(number % 100) / 10];
        String eenheden = new String[]{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}[number % 10];
        return duizendtallen + honderdtallen + tientallen + eenheden;

Conclusion:

  • 解法一: 常规思路, 利用将各个位上的罗马数字用StringBuilder连接
  • 解法二: 功力深厚的写法, 最值得学习!!!
  • 解法三:思路新奇,很简洁,相当于解法一的简化版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值