LeetCode算法题——Roman to Integer

来源:互联网 发布:学校网络下载不了 编辑:程序博客网 时间:2024/05/29 14:32

题目概述

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

分析

解决此题,需要先明确罗马数字计数法:

  • 常见字母对应的十进制表示I = 1; V = 5; X = 10; L = 50; C = 100; D = 500; M = 1000
  • 对应十进制数小的字母写在对应十进制数大的字母右侧,代表着相加,例如VIII = 5+1+1+1 = 8; 相反如果数字小的字母写在左侧则代表着相减,例如IV = 5-1 = 4
  • 相同的字母不能连续出现3次以上

明白了基本计数法以后,由于题目限定了输入整数的范围(1-3999),因此思考可以使用列表的方法,先将基本的几个计数单位列出来,之后使用贪心算法,不断比较当前输入整数的值最大可以匹配哪一个单位,输出一个罗马字符。

string intToRoman(int num) {        string ans = "";        int aArray[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};        string sArray[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};        for (int i = 0; i < 13; i++){            while (num >= aArray[i]) {                ans += sArray[i];                num -= aArray[i];            }        }        return ans;    }

算法的时间复杂度和空间复杂度均为O(1)。

总结

  • 使用贪心算法总是匹配当前最大能匹配到的字母
  • 在参数相对不是很大的时候,可以考虑将计数单位列举出来,这将极大提升算法的速度
原创粉丝点击