上下文:我是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 。为了使它起作用,您需要确保实际评估了该对象: 所述插入件在每个字符串中的字符,并且这导致反转串之间正在变成一个字符串对象。