题意:
给定一个整数,将其变为罗马数字输出
分析:
首先来看罗马数字是怎样的:
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();
}
}