第一个独特字符



给定一个字符串,在其中找到第一个不重复的字符并返回其索引。如果它不存在,则返回-1。输入字符串已全部小写。

为什么我的代码不起作用?

str1 = input("give me a string: ")
def unique(x):
stack = []
if x is None:
return (-1)
i = 0
while i < len(x):
stack = stack.append(x[i])
if x[i] in stack:
return(i)
else:
i += 1
unique(str1)
str1 = input("give me a string: ")
def unique(x):
for i in x:
if x.count(i) == 1:
return x.index(i)
else:
return -1
print(unique(str1))

这将工作

解释

不使用列表stack,而是使用字符串的count()函数。函数unique(x)将返回str1字符串中计数为1的第一个元素的索引。

您需要知道您的代码在做什么,才能弄清楚为什么它不起作用,让我们一步一步地突破它。

  1. 您创建了一个空列表stack供以后使用,这很好
  2. if x is None是检查是否给定字符串的一种奇怪方法,它不起作用,因为即使是空字符串""也不等于Noneis用于检查两侧是否为同一对象,==是检查两侧值是否相同的更好运算符。因此,if x == ""更好,但if not x更适合检查某个东西是否为空
  3. 使用变量i和while循环来迭代字符串是可以的
  4. append()就地更改列表并返回None,因此stack = stack.append(x[i])正在将None分配给堆栈
  5. CCD_ 18将引发CCD_ 19,因为CCD_。如果我们将最后一行更改为stack.append(x[i]),它现在可以工作,因为x[0]已经附加到stack,如果stack中的x[0]必须是True,并返回0作为结果

这就是您的代码所做的,您只需附加第一个字符并返回第一个索引。您需要遍历整个字符串,以了解一个字符是否是唯一的。

虽然Rishabh的答案更简洁,但我提供了一种方法,使用列表来保存可见和重复的字符,然后再次读取字符串以找到唯一字符的索引。

x = input("give me a string: ")
def unique(x):
seen = []
repeated = []
for char in x:
if char in seen:
repeated.append(char)
else:
seen.append(char)
for idx, char in enumerate(x):
if char not in repeated:
return idx
return -1
print(unique(x))

最新更新