algorithm - 整数到罗马算法时间复杂度
问题描述
问题:罗马数字由七个不同的符号表示:I、V、X、L、C、D 和 M。
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,二用罗马数字写成 II,只是两个加在一起。十二写为 XII,即 X + II。数字二十七写为 XXVII,即 XX + V + II。
罗马数字通常从左到右从大到小写。但是,四的数字不是 IIII。相反,数字四写为 IV。因为一个在五个之前,所以我们减去它得到四个。同样的原则也适用于数字九,它写成 IX。有六个使用减法的实例:
I 可以放在 V (5) 和 X (10) 之前以构成 4 和 9。X 可以放在 L (50) 和 C (100) 之前以构成 40 和 90。C 可以放在 D (500) 和之前M (1000) 得到 400 和 900。给定一个整数,将其转换为罗马数字。输入保证在 1 到 3999 的范围内。
示例 1: 输入:3 输出:“III”
示例 2: 输入:4 输出:“IV”
示例 3: 输入:9 输出:“IX”
示例 4: 输入:58 输出:“LVIII” 解释:L = 50,V = 5,III = 3。
示例 5: 输入:1994 输出:“MCMXCIV” 解释:M = 1000,CM = 900,XC = 90 和 IV = 4。
回答:
#include <unordered_map>
using namespace std;
class Solution {
public:
string intToRoman(int num) {
/*
Symbol Value
I 1
IV 4
V 5
IX 9
X 10
XL 40
L 50
XC 90
C 100
CD 400
D 500
CM 900
M 1000
*/
vector<string> romanStr {"I", "IV", "V", "IX", "X", "XL",
"L", "XC", "C", "CD", "D", "CM", "M"};
vector<int> numVals {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
string roman;
while (num != 0) {
for (int i = numVals.size() - 1; i >= 0; i--) {
if (num - numVals.at(i) < 0) continue;
num -= numVals.at(i);
roman += romanStr.at(i);
break;
}
}
return roman;
}
};
此代码将整数转换为其等效的罗马数字。但我不确定它的值是否是时间复杂度O(1)
或O(N)
时间复杂度。我认为这是因为迭代次数取决于?N
num
O(N)
num
解决方案
它是 O(n),因为对于一个非常大的数字 n,您需要 n/1000 多个女士。请记住,我们对任意大的数字感兴趣。O(n/1000) = O(n)。另请注意,这应该被视为指数,因为 n 可以由 O(log n) 位编码。对于一组有限的输入,它显然是 O(1),如评论中所述。
推荐阅读
- django - 使用 Django 标签值
- activemq-artemis - 如何从服务器获取队列列表?
- javascript - 在具有多个功能的模块的文件之间共享变量。
- mysql - 在scala中编写脚本以连接两个mysql表并创建一个对象(quill)
- sql - 插入语法错误从excel导入数据
- android - android:descendantFocusability="afterDescendants" 更改布局(似乎滚动)
- eclipse - 如果 module-info.java 存在,Eclipse 2018-09 找不到测试类
- javascript - 实时服务器上的间歇性 AJAX 错误
- react-native - React Native 如何拥有沉浸式模态
- javascript - 不使用 jQuery 发送不和谐 webhook