leetcode_middle_22_12. Integer to Roman

题意:

给定一个整数,将其变为罗马数字输出

分析:

首先来看罗马数字是怎样的:

I(1),V(5),X(10),L(50),C(100),D(500),M(1000)
一个罗马数字重复几次,就表示这个数的几倍
 

本来我的思路是从1000开始去作除法,处理完七个,但是发现逻辑是不对的,除此之外还有两个问题。首先过多的条件判断,一定要利用循环,显然想到放入数组,对数组循环,放入数组就可以利用循环了。其次,本来sb.append是单独循环处理的,其实可以放入处理num的数据的循环里面处理。

小结:数据的存储和处理,一定要思考有没有办法简化,合并,因为人的思维很多时候是一种复杂的直接的思路,比如对一个例子3200,就容易想到取商取得3,然后循环三次,放M入字符串,然后对num取余处理。然后对这样一个复杂的思路,我们可以去想实质上就是数字里面有几个1000,字符串就要加几个M,而且数字要变为去除这些1000之后的数字。所以很自然的我们发现采取数字每减1000的同时字符串加一个M的方式,直到数字小于1000。(显然是一个内层while循环)

参考之后的代码:

public class Solution {
    public String intToRoman(int num) {
    int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    String[] strs = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};  //i将两个数组的内容对应起来,和map比,容易遍历
    
    StringBuilder sb = new StringBuilder();
    
    for(int i=0;i<values.length;i++) {
        while(num >= values[i]) {
            num -= values[i];
            sb.append(strs[i]);
        }
    }
    return sb.toString();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值