题目描述
添整数转罗马数字
以下是首次实现的思考:
第一种方法,对应数字的方法。
考虑一位数的情况,可以用直接的数组;
考虑两位数的情况:
十位上的数值<4,数值对应有多少个X,剩下的按照一位数的情况来写
十位上的数值=4,对应XL,剩下的按照一位数的情况来写;
5<十位上的数值>9,数值对应有L加个(数值减5)个XX,剩下的按照一位数的情况来写
十位上的数值=9,对应XC,剩下的按照一位数的情况来写;
考虑三位数的情况:
百位上的数值<4,数值对应有多少个C,剩下的按照两位数的情况来写
百位上的数值=4,对应CD,剩下的按照两位数的情况来写;
5<百位上的数值>9,对应,数值对应有D加个(数值减5)个C,剩下的按照两位数的情况来写
百位上的数值=9,对应CM,剩下的按照两位数的情况来写;
考虑四位数的情况:
千位上的数值<4,数值对应有多少个M,剩下的按照三位数的情况来写
反思:1、需要动态变化的值设成标兵,不要用固定的值代替,比如决定位置的坐标不应该用原先数字长度来固定。
而是随动态的数据长度来改变。
2、1994出现错误,主要是max的影响,max=max*10;
3、10出错,主要是因为即使是两位数,由于没有0的表示,所以要先判断,如果为0,直接len-1。
4、60出错,主要是在构建val数组时大意了
5、101出错,考虑10的数字时不够严谨,此时的len不应该由减1来决定,而是由动态的数字来决定,
长度改变,max也要动态变化。
提交通过,但是性能很不乐观。
这里还有一种考虑:比较固定特殊数字对应字符的大小,不断做比较,字符叠加的操作。
实现代码如下:
public static String intToRoman(int num) {
int[] val= {1,4,5,9,10,40,50,90,100,400,500,900,1000};
String [] valtag= {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
String res="";
int i=12;
while(num>0)
{
if(num>=val[i])
{
res+=valtag[i];
num-=val[i];
}
else
{
i--;
}
}
return res;
}
时间上的性能有所提升,但是内存却没有。真不知道大佬们时如何节省内存的。
今天电脑卡得要死,python的代码实在卡得写不了。所以。。暂时就没有python版本的代码了。
而且今天很深的一个感悟,思路清楚的时候,好实现,性能也很好。但是如果没有一个很清晰的思路时,前行就会磕磕绊绊。这里并不是强调越快且简洁的就是好,而是:凡是都有一个过程,只有经过了磕磕绊绊,才能走出自己的道路。共勉。