Leetcode12:Integer to Roman

Leetcode12:Integer to Roman

题目描述:Integer to Roman

简而言之,将1-3999的数字转变为罗马数字。

可以使用分解因子的方法,结合贪心思想解决问题

解题过程

仔细看了几遍题目,完全没有想出巧妙的解决方法,就按自己的理解写了算法,竟然也过了。
主要就是把1,5,4,9这几种情况考虑全面,然后因为个,十,百,千……都是一样的规律,所以可以作为参数传入函数。虽然可行,但是冗余的判断条件太多,扩展性太差。

public String intToRoman(int num) {
		String resultString="";
		if (num==0) {
			return resultString;
		}
		if (num<10) {
			return getUnits(num,"I","V","X");
		}
		int i=1;
		int temp=num;
		while(temp/10!=0) {
			i++;
			temp/=10;
		}
		while (i>0) {
			switch (i) {
			case 4:
				temp=num/1000;
				num=num%1000;
				resultString=resultString+getUnits(temp,"M","","");
				break;
			case 3:
				temp=num/100;
				num=num%100;
				resultString=resultString+getUnits(temp,"C","D","M");
				break;
			case 2:
				temp=num/10;
				num=num%10;
				resultString=resultString+getUnits(temp,"X","L","C");
				break;
			case 1:
				temp=num;
				resultString+=getUnits(temp,"I","V","X");
				break;

			default:
				break;
			}
			i--;
		}
		return resultString;
	}
	public String getUnits(int num, String sign,String fiveSign,String tenSign) {
		String unitString="";
		if (num<4&&num>0) {
			for (int i = 0; i < num; i++) {
				unitString+=sign;
			}
		}
		else if (num==4) {
			unitString=unitString+sign+fiveSign;
		}
		else if (num>4&&num<9) {
			unitString=fiveSign;
			for(int i=0;i<num-5;i++) {
				unitString+=sign;
			}
		}
		else if (num==9) {
			unitString=unitString+sign+tenSign;
		}

		return unitString;
	}

看了题解后,恍然大悟:

罗马数字阿拉伯数字
M1000
CM900
D500
CD400
C100
XC90
L50
XL40
X10
IX9
V5
IV4
I1

可以把罗马数字当作上表中的各个因子之和,即使用上表右边的数字作为加法因子去分解一个整数,并且所使用的整数越少越好。那么可以考虑为一个“贪心”问题,每次用这个整数减去最大的数。
题解的方法,更易扩展,而且思维更加巧妙。最少纸币应该也可以用这个方法。

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"};
        String reString="";
        int i=0;
        int temp=num;
        while (i<nums.length) {
			while (temp>=nums[i]) {
				reString+=romans[i];
				temp-=nums[i];
			}
            i++;
			
		}
        return reString;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值