算法笔记——将罗马数字转为整数
题目来源:力扣(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;
}
}
知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。
所谓诚其意者,毋自欺也。