算法笔记——将罗马数字转为整数

题目来源:力扣(LeetCode)
//I             1
//V             5
//X             10
//L             50
//C             100
//D             500
//M             1000

//I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
//X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
//C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900

//输入范围 1 - 3999 

示例 1:

输入: "III"
输出: 3
示例 2:

输入: "IV"
输出: 4
示例 3:

输入: "IX"
输出: 9
示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

解答如下:

class Solution {

    /**
     * @param String $s
     * @return Integer
     */
    function romanToInt($s) {
        // 通过字符串当做数组进行遍历
        // $rome = ["I"=>1, 'V'=>5, 'X'=>10, 'L'=>50, 'C'=>100, 'D'=>500, 'M'=>1000];
        // $len = strlen($s);
        // $sum = 0;
        // for($i=0; $i<$len; $i++){
        //     $sum += $rome[$s[$i]];
        //     if($i>=1 && ($rome[$s[$i-1]] < $rome[$s[$i]])){
        //         $sum -= $rome[$s[$i-1]]*2;
        //         if($i>=2 && ($rome[$s[$i-2]] < $rome[$s[$i-1]])){
        //             $sum -= $rome[$s[$i-2]]*2;
        //         }
        //     }
        // }
        // return $sum;

        // 通过指针来遍历数组
        $rome = ["I"=>1, 'V'=>5, 'X'=>10, 'L'=>50, 'C'=>100, 'D'=>500, 'M'=>1000];
        $arr = str_split($s);
        $sum = 0;
        do{
            $sum += $rome[current($arr)];
            if(key($arr)>=1){
                $cur = $rome[current($arr)];
                prev($arr);
                if($rome[current($arr)] < $cur){
                    $sum -= $rome[current($arr)]*2;
                    if(key($arr)>=1){
                        $cur = $rome[current($arr)];
                        prev($arr);
                        if($rome[current($arr)] < $cur){
                            $sum -= $rome[current($arr)]*2;
                        }
                        next($arr);
                    }
                }
                next($arr);
            }
        }while(next($arr));
        return $sum;
    }
}
原文地址:https://www.cnblogs.com/lz0925/p/12171034.html