力扣-阿拉伯数字转罗马数字

先减到<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))

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容