题目:
罗马数字包含以下七种字符:I, V, X, L, C, D, M
1 字符 数值 2 I 1 3 V 5 4 X 10 5 L 50 6 C 100 7 D 500 8 M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
给你一个整数,将其转为罗马数字。
示例 1:
输入: num = 3
输出: "III"
示例 2:
输入: num = 4
输出: "IV"
示例 3:
输入: num = 9
输出: "IX"
示例 4:
输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-to-roman
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
贪心算法定义:在对问题求解时,总是做出在当前看来是最好的选择。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
与付款找零类似的道理,优先选择最大面额的人民币进行找零,使得顾客得到的纸张数最少。
1.首先将阿拉伯数字与罗马数字可能出现的所有情况和对应关系,降序排列放在两个数组中;
2.然后寻找不超过给定数值num的最大值,将该最大值对应的罗马数字添加到结果字符数组中,并将num减去找到的最大值,再继续寻找不超过新num的最大值,直到新num值为0,则结束循环,将字符数组转换成字符串进行返回即可。
代码:
小知识:
StringBuffer:可变的字符序列:线程安全的,效率低。底层使用char[]存储。
StringBuilder:可变的字符序列:线程不安全的,效率高。底层使用char[]存储。