Algorithm 整数到罗马算法时间复杂度
问题: 罗马数字由七种不同的符号表示:I、V、X、L、C、D和MAlgorithm 整数到罗马算法时间复杂度,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,问题: 罗马数字由七种不同的符号表示:I、V、X、L、C、D和M Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如,2用罗马数字写成II,只是两个1加在一起。十二写为,XII,也就是X+II。数字二十七写为XXVII,即XX+V+II 罗马数字通常是从左到右从大
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,2用罗马数字写成II,只是两个1加在一起。十二写为,XII,也就是X+II。数字二十七写为XXVII,即XX+V+II
罗马数字通常是从左到右从大到小写的。然而,四的数字不是IIII。取而代之的是,数字4写为IV。因为1在5之前,我们减去它就等于4。同样的原则也适用于数字9,即写为IX的数字。使用减法的情况有六种:
我可以放在V(5)和X(10)之前,得到4和9。
X可以放在L(50)和C(100)之前,形成40和90。
C可以放在D(500)和M(1000)之前,使其成为400和900。
给定一个整数,将其转换为罗马数字。输入保证在1到3999之间
示例1:
投入:3
产出:“三”
示例2:
投入:4
产出:“四”
示例3:
投入:9
产出:“九”
示例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;
}
};
#包括
使用名称空间std;
类解决方案{
公众:
字符串intToRoman(int num){
/*
符号值
I 1
IV 4
V 5
IX 9
x10
XL 40
L 50
XC 90
C100
CD 400
D 500
900厘米
M 1000
*/
向量romanStr{“I”、“IV”、“V”、“IX”、“X”、“XL”,
“L”、“XC”、“C”、“CD”、“D”、“CM”、“M”};
向量数值{1,4,5,9,10,40,50,90,100,400,500,900,1000};
弦罗马;
while(num!=0){
对于(int i=numVals.size()-1;i>=0;i--){
如果(num-numVals.at(i)<0)继续;
num-=numVals.at(i);
roman+=romanStr.at(i);
打破
}
}
返回罗马;
}
};
此代码将整数转换为等效的罗马数字。但是我不确定它是O(1)
还是O(N)
时间复杂度,其中N
是num
的值。我认为它是O(N),因为迭代次数取决于num
?的值,它是O(N)因为对于一个非常大的数N,你需要N/1000多毫秒。记住,我们对任意大的数感兴趣。O(n/1000)=O(n)。还要注意,这应该被认为是指数的,因为n可以由O(logn)位编码。
对于一组有限的输入,它显然是O(1),如注释中所述。它是O(n),对于一个非常大的数字n,您需要n/1000多毫秒。记住,我们对任意大的数字感兴趣。O(n/1000)=O(n)。还要注意,这应该被认为是指数的,因为n可以由O(logn)位编码。
对于一组有限的输入,它显然是O(1),如注释中所述。因为输入保证在1到3999的范围内,我们可以称之为O(1),因为这个问题甚至对“大n”都不重要。(无论如何,这对于时间复杂度分析来说并不是一个有趣的问题,因为这一点,我恳请你继续。)因为输入保证在1到3999的范围内,我们可以称之为O(1),因为这个问题甚至对“大n”都不重要。(无论如何,由于这一点,时间复杂性分析并不是一个有趣的问题,我恳请您继续。)您对O(1)声明有何看法?我无法将此声明视为匿名用户。但请记住,他们说“输入保证在1到3999之间。”。这意味着一组有限的输入,使得O表示法不相关,因为对于每个只有有限多个输入的问题,O(1)表示法都是O(1)。你能详细说明一下你认为它是如何呈指数增长的吗?通常你会根据输入的大小来分析增长。以n作为输入,假设我们使用e。G二进制编码,产生m=Θ(logn)的输入长度。那么我们的复杂性是O(n)=O(exp(m))。@而且它确实没有清楚地解释您的复杂性。另外,对于任意大的数字,您的复杂性似乎是不正确的。想想还有什么其他的操作,比如减法或加法。我认为应该是O(N*LogN),其中N是数字,如果你能很好地解释为什么你可以用O(N)或O(NLogN)或任何你的说法,我将删除我的否决票,并将其改为反对票。我同意它在数字空间中是指数型的,即O(数字*10^位)。你如何看待O(1)声明?作为一个匿名用户,我看不到这个声明。但请记住,他们说“输入保证在1到3999之间。”。这意味着一组有限的输入,使得O表示法不相关,因为对于每个只有有限多个输入的问题,O(1)表示法都是O(1)。你能详细说明一下你认为它是如何呈指数增长的吗?通常你会根据输入的大小来分析增长。以n作为输入,假设我们使用e。G二进制编码,产生m=Θ(logn)的输入长度。那么我们的复杂性是O(n)=O(exp(m))。@而且它确实没有清楚地解释您的复杂性。对于任意大的数字,您的com