先减到<1000;
对于 >100, >10, >1 分为三档,每档里有4个“分界点”,针对每个分界点,循环减。
三层for循环。看着时间复杂度挺大,但其实最外层两个循环次数都是常数;里面的是
O(n)。所以整体时间复杂度是O(n)。
一个通用的写法:
package main
import "fmt"
func l_m12(num int) string {
var res string
mp := map[int]string{
1:"I",
5:"V",
10:"X",
50:"L",
100:"C",
500:"D",
1000:"M",
4:"IV",
9:"IX",
40:"XL",
90:"XC",
400:"CD",
900:"CM",
}
jins :=[][]int{}
jins = append(jins,[]int{1,4,5,9})
jins = append(jins,[]int{10,40,50,90})
jins = append(jins,[]int{100,400,500,900})
for ;;{
if num<1000{
break
}
res +="M"
num-=1000
}
for j:=2;j>=0;j--{
line:=jins[j]
for i :=3; i>=0;i--{
for ;num>=line[i];{
res += mp[line[i]]
num -= line[i]
}
}
}
return res
}
// I 1
// V 5
// X 10
// L 50
// C 100
// D 500
// M 1000
func main(){
fmt.Println(l_m12(1994))
}