Java LeetCode 273的时间复杂度是多少。整数到英语单词?

Java LeetCode 273的时间复杂度是多少。整数到英语单词?,java,time-complexity,stringbuilder,string-concatenation,Java,Time Complexity,Stringbuilder,String Concatenation,我正在努力理解这个解决方案的时间复杂性。这个问题是关于把数字转换成英语单词的 比如说,, 输入:num=1234567891 产量:“十亿二亿三千四百五十六万七千八百九十一” StringBuilder insert()的时间复杂度为O(n)。 我猜想时间复杂度是O(n^2)。但我不确定。其中n是位数。 问题链接: 这是我的代码: 代码: 类解决方案{ 私有最终字符串[]千={”、“千”、“百万”、“十亿”}; 私有最终字符串[]小于_二十={”、“一”、“二”、“三”、“四”、“五”, “六”

我正在努力理解这个解决方案的时间复杂性。这个问题是关于把数字转换成英语单词的

比如说,, 输入:num=1234567891 产量:“十亿二亿三千四百五十六万七千八百九十一”

StringBuilder insert()的时间复杂度为O(n)。
我猜想时间复杂度是O(n^2)。但我不确定。其中n是位数。 问题链接:

这是我的代码:

代码:

类解决方案{
私有最终字符串[]千={”、“千”、“百万”、“十亿”};
私有最终字符串[]小于_二十={”、“一”、“二”、“三”、“四”、“五”,
“六”、“七”、“八”、“九”、“十”、“十一”、“十二”、“十三”、“十四”,
“十五”、“十六”、“十七”、“十八”、“十九”};
私有最终字符串[]十={“”,“二十”,“三十”,“四十”,“五十”,
“六十”、“七十”、“八十”、“九十”};
//O(n)溶液
公共字符串numberToWords(int num){
如果(num==0){
返回“零”;
} 
StringBuilder sb=新的StringBuilder();
int指数=0;
//这增加了时间复杂性
while(num>0){
如果(数值%1000>0){
StringBuilder tmp=新的StringBuilder();
助手(tmp,数量%1000);
系统输出打印项次(索引);
System.out.println(“tmp:+tmp”);
追加(千[索引])。追加(“”);
//我怀疑时间复杂度会因此增加到O(n^2)
sb.插入(0,tmp);
}
索引++;
num=num/1000;
}
使某人恢复原状;
}
私有void助手(StringBuilder tmp,int num){
如果(num==0){
回来
}否则如果(数值<20){
tmp.append(少于二十[num])。append(“”);
回来
}否则如果(数值<100){
tmp.append(十个[num/10])。append(“”);
助手(tmp,数量%10);
}否则{
追加(少于二十[num/100])。追加(“百”);
助手(tmp,数量%100);
}
}
}
假设
n
num
,它是O(log n),因为
n
的数值的每位数少于2个字,并且位数是
ceil(log₁₀(n) )

将该值加倍可能会增加两个字。

时间复杂度为O(n),其中n是给定数字中的位数。 我们正在遍历该数字一次


我从在思科和谷歌工作的几个朋友那里证实了这一点。

嗨,安德烈亚斯,谢谢你的回答。但这里的N是,假设是数字中的位数。如果n是位数(134-->3位数),您能建议时间复杂度是多少吗?@sujitamin这绝对是我不会做的假设,这表明在试图确定大O复杂度时定义
n
是多么重要。由于结果最多为每位数2个字,且字的平均长度不变,因此复杂性为O(n)。“数组中的位数”是什么数组?抱歉,编辑了答案。
class Solution {
    private final String[] THOUSANDS = {"", "Thousand", "Million", "Billion"};
    
    private final String[] LESS_THAN_TWENTY = {"", "One", "Two", "Three", "Four", "Five", 
    "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen",
     "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
    
    private final String[] TENS = {"", "", "Twenty", "Thirty", "Forty", "Fifty",
     "Sixty", "Seventy", "Eighty", "Ninety"};
    //O(n) solution
    public String numberToWords(int num) {
        if (num == 0){
          return "Zero";  
        } 
        StringBuilder sb = new StringBuilder();
        int index = 0;
        //this contributes towards time complexity
        while (num > 0) {
            if (num % 1000 > 0) {
                StringBuilder tmp = new StringBuilder();
                helper(tmp, num % 1000);
                System.out.println(index);
                System.out.println("tmp: "+ tmp);
                tmp.append(THOUSANDS[index]).append(" ");
                //I suspect the time complexity will increase because of this to O(n^2)
                sb.insert(0, tmp);
            }
            index++;
            num = num / 1000;
        }
        return sb.toString().trim();
    }
    
    private void helper(StringBuilder tmp, int num) {
        if (num == 0) {
            return;
        } else if (num < 20) {
            tmp.append(LESS_THAN_TWENTY[num]).append(" ");
            return;
        } else if (num < 100) {
            tmp.append(TENS[num / 10]).append(" ");
            helper(tmp, num % 10);
        } else {
            tmp.append(LESS_THAN_TWENTY[num / 100]).append(" Hundred ");
            helper(tmp, num % 100);
        }
    }
}