1
+ <?php
2
+ /**
3
+ * [solution description] 转化为罗马数字
4
+ * @param [type] $roman [description]
5
+ * @return [type] [description]
6
+ */
7
+ function solution ($ roman ) {
8
+ $ number = 0 ;
9
+ $ symbolArr = [
10
+ 'I ' => 1 ,
11
+ 'V ' => 5 ,
12
+ 'X ' => 10 ,
13
+ 'L ' => 50 ,
14
+ 'C ' => 100 ,
15
+ 'D ' => 500 ,
16
+ 'M ' => 1000 ,
17
+ ];
18
+ // 循环字符串
19
+ for ($ i = 0 ; $ i < strlen ($ roman ); $ i ++) {
20
+ // 对应字符串的字符在罗马数组的值
21
+ $ value = $ symbolArr [$ roman [$ i ]];
22
+ // 若$i 等于 该字符串的最后一个或者 $i后一个的值小于当前的值则相加
23
+ if ($ i == strlen ($ roman ) - 1 || $ symbolArr [$ roman [$ i + 1 ]] <= $ value ) {
24
+ $ number += $ value ;
25
+ } else { // 否则减去 排除如 CD, XC这种情况
26
+ $ number -= $ value ;
27
+ }
28
+
29
+ }
30
+ return $ number ;
31
+ }
32
+
33
+ function solution_clever ($ roman ) {
34
+ $ number = 0 ;
35
+ $ numerals = array ("CM " => 900 , "M " => 1000 , "CD " => 400 , "D " => 500 , "XC " => 90 , "C " => 100 , "XL " => 40 , "L " => 50 , "IX " => 9 , "X " => 10 , "IV " => 4 , "V " => 5 , "I " => 1 );
36
+
37
+ foreach ($ numerals as $ numeral => $ value ) {
38
+ // 通过str_replace 统计字符串的出现次数
39
+ $ roman = str_replace ($ numeral , "" , $ roman , $ count );
40
+ // 根据次数来计算
41
+ $ number += $ count * $ value ;
42
+ }
43
+
44
+ return $ number ;
45
+ }
0 commit comments