给定一个字符串,在其中找到第一个不重复的字符并返回其索引。如果它不存在,则返回-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的第一个元素的索引。
您需要知道您的代码在做什么,才能弄清楚为什么它不起作用,让我们一步一步地突破它。
- 您创建了一个空列表
stack
供以后使用,这很好 if x is None
是检查是否给定字符串的一种奇怪方法,它不起作用,因为即使是空字符串""
也不等于None
。is
用于检查两侧是否为同一对象,==
是检查两侧值是否相同的更好运算符。因此,if x == ""
更好,但if not x
更适合检查某个东西是否为空- 使用变量
i
和while循环来迭代字符串是可以的 append()
就地更改列表并返回None
,因此stack = stack.append(x[i])
正在将None
分配给堆栈- 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))