Algorithm 整数到罗马算法时间复杂度

Algorithm 整数到罗马算法时间复杂度,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 罗马数字通常是从左到右从大

问题: 罗马数字由七种不同的符号表示: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

罗马数字通常是从左到右从大到小写的。然而,四的数字不是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