题目来源:力扣(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