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

实施算法以确定字符串是否具有所有唯一字符

柏明亮
2023-03-14
问题内容

上下文:我是CS
n00b,正在通过“破解编码面试”来完成自己的工作。第一个问题要求“实施一种算法以确定字符串是否具有所有唯一字符”。我的(可能是幼稚的)实现如下:

def isUniqueChars2(string):
  uchars = []
  for c in string:
    if c in uchars:
      return False
    else:
      uchars.append(c)
  return True

作者建议以下实现:

def isUniqueChars(string):
  checker = 0
  for c in string:
    val = ord(c) - ord('a')
    if (checker & (1 << val) > 0):
      return False
    else:
      checker |= (1 << val)
  return True

是什么使作者的实现比我的更好(FWIW,作者的解决方案是在Java中,我将其转换为Python
-我的解决方案是无法在Java中实现的解决方案)吗?或者,更一般而言,解决该问题需要什么?我采用的方法有什么问题?我假设有一些基本的CS概念(我不熟悉)很重要,可以帮助您选择采用哪种方法来解决此问题。


问题答案:

这是我的写法:

def unique(s):
    return len(set(s)) == len(s)

字符串是可迭代的,因此您可以直接将参数传递给以set()从字符串中获取一组字符(根据定义,该字符将不包含任何重复项)。如果该集合的长度与原始字符串的长度相同,那么您将拥有完全唯一的字符。

您当前的方法还不错,我认为它比作者建议的版本更具Python语言和可读性,但是您应该更改uchars为集合而不是列表。集合具有O(1)隶属关系测试,因此c in uchars如果uchars是集合而不是列表,则平均速度将大大提高。因此,您的代码可以编写如下:

def unique(s):
    uchars = set()
    for c in s:
        if c in uchars:
            return False
        uchars.add(c)
    return True

如果字符串很大并且早期有重复项,这实际上比我的版本更有效,因为它会短路(找到第一个重复项后立即退出)。



 类似资料:
  • 我在练习面试问题,其中一个问题是:“实现一个算法来确定字符串是否具有所有唯一的字符”。 但我的问题是:如果我们假设string可以包含象形文字符号或任何东西(代码点大于u+ffff...?),那么该如何解决。 所以,如果我理解的正确,我可以很容易地想到解决方案,如果给定的字符串包含的字符属于从u+0000到u+ffff的字符集--它们可以转换成16位char,但如果我遇到一个字符的代码点大于u+f

  • 问题内容: 我对位向量如何实现此功能感到困惑(对位向量不太熟悉)。这是给出的代码。有人可以引导我完成这个吗? 特别是,这是怎么做的? 问题答案: 在这里用作位存储。整数值中的每个位都可以视为一个标志,因此最终是一个位数组(标志)。代码中的每一位都说明是否在字符串中找到带有位索引的字符。您可以出于相同的原因而不是使用位向量。它们之间有两个区别: 大小 。具有固定大小,通常为4个字节,这意味着8 *

  • 问题内容: 我想将字符添加到字符串中,但要确保最终列表中的所有字母都是 唯一的 。 例如:→ 现在,我当然想到了两种解决方案。一种是使用,它将字符与ASCII码映射。因此,每当我遇到一个字母时,它都会将索引设置为。之后,我将扫描列表并附加所有已设置的列表。时间复杂度为 O(n) 。 另一个解决方案是使用和遵循相同的过程。映射完每个字符后,我将对字典中的每个键进行操作。这也将具有 线性 运行时间。

  • 问题内容: 我在寻找Python中的方法。 我想要做: 问题答案: 你可以使用in运算符:

  • 代码非常简单。它会检查所有字符一次,并替换第一次出现的字符。然而,输入=“aab”失败。我不知道为什么。编程语言是java。 编辑 我改了密码。现在它抛出了一个输入错误 错误: 线程“main”java中出现异常。util。正则表达式。PatternSyntaxException:索引1附近的未关闭组(^at java.util.regex.Pattern.error,Pattern.java:1

  • 问题内容: 我编写了两个简单的函数来确定字符串是否是回文。我以为它们是等效的,但是2不起作用。为什么是这样? 1个 2 问题答案: 不会创建字符串,而是创建“反向”对象: 因此,字符串不等于object 。为了使它起作用,您需要确保实际评估了该对象: 所述插入件在每个字符串中的字符,并且这导致反转串之间正在变成一个字符串对象。