Leetcode #12 & #13 Integer to Roman & Roman to Integer 解题小节

1 题目理解

这回还是调整一下结构吧,把题目理解放前面,这样生成导语的时候方便些。
这次是两道题目一起,因为是正反对应的题,12是整数到罗马数,13是罗马数字到整数

关于第一个问题,整数到罗马,关键点在于理解罗马数的表达方式,大家可以自行搜索,或者看我给出的链接(在代码那里),我就在此基础上提示解题方法:

根据罗马数的规则,同样的罗马符号允许出现三次,且题目给定的数字也一定是合法的,那么久直接用整除+取余数来确定每个罗马符号的输出就好。。很简单

对于第二个问题,罗马数到整数,就更简单了,从头部来,直接读符号,输出就好。。

两题里面只特别提示:
1、使用static数组可以加快速度,提前放好规则
2、顺去记得搞对!特别是罗马到整数,从高部到低部(因为罗马数标表示有符号的叠加)

2 原题

#11整数到罗马

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

#12罗马到整数
Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

3 Integer to Roman

public class Solution {
    /**
     * 这题主要看规则。。。http://www.tuicool.com/articles/fUVNJb
     *  网上找了个。。然后就是打印输出了。。呵呵嗒
     * */
    static int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
    static String names[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
    public String intToRoman(int num) {

        StringBuilder result=new StringBuilder();
        int i,j;
        for(i=0;i<13;i++){
            for(j=0;j<num/values[i];j++)
                result.append(names[i]);
            num=num%values[i];
        }
        return result.toString();
    }
}

4 Roman to Integer

public class Solution {
    /**
     * 
     * 这道题和上面也一样,本来么,用Hash+String自带的方法做也挺好的。。但毕竟这个可以看时间。。所以写个耗时短的,可能看起来也不那么短了就
     * 
     * 原理很简单哦,和上面一样,顺着看有几个M 然后几个CM。。。,出现M就+1000,出现CM就+900,顺着来,反正只要给的不错,就算得出阿里
     * */
    static int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
    static char names[][]={{'M'},{'C','M'},{'D'},{'C','D'},{'C'},{'X','C'},{'L'},{'X','L'},{'X'},{'I','X'},{'V'},{'I','V'},{'I'}};
    public int romanToInt(String s) {
        int result=0,i,j,k;
        char chars[]=s.toCharArray();
        boolean flag=false;
        j=0;
        i=0;
        while (i<values.length){
            flag=false;
            for(k=0;k<names[i].length;k++){
                if(j+k >= chars.length || names[i][k]!=chars[j+k])
                    break;
            }
            if(k==names[i].length){
                result+=values[i];
                j+=k;
            } else{
                i++;
            }
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值