当前位置: 首页 > 面试题库 >

了解大符号-破解编码面试

郎弘业
2023-03-14
问题内容

我需要帮助,以帮助作者了解“大O”一章中问题11的答案。

问题是这样的:

下面的代码打印所有长度为k的字符串,其中字符按html" target="_blank">排序顺序排列。它通过生成所有长度为k的字符串,然后检查每个字符串是否已排序来做到这一点。它的运行时间是多少?

public static int numChars = 26;

public static void printSortedStrings(int remaining) {
    printSortedStrings(remaining, "");
}

public static void printSortedStrings(int remaining, String prefix) {
    if (remaining == 0) {
        if (isInOrder(prefix)) {
            System.out.println(prefix); // Printing the string
        }
    } else {
        for (int i = 0; i < numChars; i++) {
            char c = ithLetter(i);
            printSortedStrings(remaining - 1, prefix + c);
        }
    }
}

public static boolean isInOrder(String s) {
    for (int i = 1; i < s.length(); i++) {
        int prev = ithLetter(s.charAt(i - 1));
        int curr = ithLetter(s.charAt(i));
        if (prev > curr) {
            return false;
        }
    }
    return true;
}

public static char ithLetter(int i) {
    return (char) (((int) 'a') + i);
}

public static void main(String[] args) {
    printSortedStrings(2);
}

预订答案:

O(kc k),其中k是字符串的长度,c是字母中的字符数。生成每个字符串需要O(c k)时间。然后,我们需要检查所有这些是否已排序,这需要O(k)时间。

请注意,上面的答案未考虑打印字符串,但是在其他问题中我却发现了相反的情况。

您何时考虑在运行时中打印字符串?

这是正确的答案 O(k 2 c k)吗?

此外,任何能够快速告诉您此代码运行时中存在指数部分的建议都将不胜感激。:)


问题答案:

简而言之,没有。正确答案是书中的O(kc k)。

在检查完一个字符串以检查其字符是否有序(占用O(k))之后,打印该字符串将仅增加O(k)-这不会改变您的复杂性。

假设测试字符串是否已排序需要进行a*k操作,而打印则需要进行操作b*k。这样,每个字符串的操作总数最多为(a+b)*kO(k)。

编辑: 关于问题的第二部分,遍历具有固定长度的所有单词将导致指数级的运行时复杂度,因为存在c
k个这样的单词,其中c的大小是字母的大小,也是k该单词的长度。



 类似资料:
  • 我有一个用mvn Exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印工作,根据文档getBytes使用给定的字符集将字符串编码成字节序列,字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新的字符串

  • 一堆盘子:想象一堆盘子。如果堆栈太高,它可能会倒塌 因此,在现实生活中,当前一个堆栈超过某个阈值时,我们可能会启动一个新堆栈。实现一组数据结构堆栈,以模仿这一点。SetOfstack应该由几个堆栈组成,并且应该在前一个堆栈超过容量时创建一个新的堆栈。 一组堆栈。推()和一组堆栈。pop()的行为应该与单个堆栈相同(也就是说,pop()应该返回与只有单个堆栈时相同的值) 后续 实现一个函数popAt

  • 问题内容: 这个问题已经在这里有了答案 : Unicode错误序数不在范围内 (1个答案) 3年前关闭。 我只是无法了解其功能以及如何在python2.7上工作 我尝试了以下声明 直到这里,我认为这很清楚;将Unicode代码转换为相应的utf-8 / 16/32字节字符串。 但是当我编写代码时: 为什么在unicode类型上的含义?为什么第一个(使用utf8)而不是后者可以工作?是因为pytho

  • 问题内容: ’=?KOI8-R?B?W1JFUS0wMDI1NDEtNDc5NzddIO / h7yAi89TSz8rGwdLGz9IiIDs =?= \ r \ n \ t =?KOI8-R?B?Ry43MjkgKDEwKQ ==?=’ 如何将其转换为可读的内容?谢谢 ! 问题答案: email.header.decode_header(‘=?KOI8-R?B?W1JFUS0wMDI1NDEtN

  • 这是我第一次在这里寻求帮助,我的部门(政府)已经在市场上发布了一些应用程序(Google Play),直到昨天,当我在Nexus上获得Jelly Bean 4.2时,加密和描述一直运行得很好。加密工作正常,它实际上加密了要存储的信息。虽然当解密它时,我得到了一个异常,就像这样:填充块损坏。我已经检查了字符串,并且它与其他设备上的字符串一致(出于测试目的使用相同的密钥),这意味着它完全相同。问题是我

  • 问题内容: 我想了解如何将带符号的数字转换为无符号的数字。 可以说我有这个: 为了使其无符号,我必须选择“更大”的数据类型“ short”,并应用值为0x00ff的AND运算符。 为什么使数字无符号? 问题答案: Java实际上没有无符号原语。 值127实际上由“ 01111111”表示,第一位是符号(0为正)。 一个无符号字节将能够保存0到255的值,但是127是有符号字节的最大值。由于一个字节