leetcode — two-sum

import java.util.HashMap;
import java.util.Map;

/**
 * Source : https://oj.leetcode.com/problems/roman-to-integer/
 *
 * Created by lverpeng on 2017/7/10.
 *
 * Given a roman numeral, convert it to an integer.
 * Input is guaranteed to be within the range from 1 to 3999.
 *
 */
public class RomanToInteger {
    private static final Map<Character, Integer> map = new HashMap<Character, Integer>(){
        {
            put('V', 5);
            put('L', 50);
            put('I', 1);
            put('D', 500);
            put('X', 10);
            put('M', 1000);
            put('C', 100);
        }
    };

    /**
     * 较小的数在较大的数的左边则结果为:较大的数减去较小的数
     * 较大的数在较小的数的右边则结果为:较大的数和较小的数的和
     * 从第二个字符开始依次遍历每一个字符:
     *  先加上第一个字符的值(后面会判断如果右边的数大于该值,则会减去)
     *  将当前数与前一个数进行比较
     *      如果当前数更大,则加上该数
     *      否则,减去前面一个数,再减去两个数共同表示的数:较大的减去较小的
     *
     * @param numStr
     * @return
     */
    public int romanToInteger (String numStr) {
        int result =  map.get(numStr.charAt(0));
        for (int i = 1; i < numStr.length(); i++) {
            int pre = map.get(numStr.charAt(i - 1));
            int current = map.get(numStr.charAt(i));
            if (pre >= current) {
                result += current;
            } else {
                result = result - pre + (current - pre);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        RomanToInteger romanToInteger = new RomanToInteger();
        System.out.println(romanToInteger.romanToInteger("M") + "------1000" );
        System.out.println(romanToInteger.romanToInteger("MXXXVIII") + "------1038");
        System.out.println(romanToInteger.romanToInteger("II") + "------2");
        System.out.println(romanToInteger.romanToInteger("III") + "------3");
        System.out.println(romanToInteger.romanToInteger("IV") + "------4");
        System.out.println(romanToInteger.romanToInteger("MMMXCIV") + "------3094");
    }
}
posted @ 2017-08-09 07:47  lacker  阅读(114)  评论(0编辑  收藏  举报