我正在 CodeSignal 上进行一些编码以刷新我的知识。
有人问我这个问题:
假设您有一个单词列表,例如 ['apple', 'banana', 'apple', 'mango', 'banana']。每个单词可以重复任意次数。将此列表视为太空时代水果工厂的传送带。现在,您的任务是识别传送带上最后一个独特的水果,即不重复的水果。如果所有的水果都是重复的,那么就没有任何独特的水果,并且您的函数应该返回一个空字符串('')。
您的函数应该采用字符串列表(水果传送带)作为输入。现在,字符串可以是任何单词,而不仅仅是水果名称,并且列表可以包含任意数量的字符串。还可能存在一种边缘情况,即列表根本没有字符串(空传送带,是吗?)。对于输出,您的函数应返回列表中最后一个唯一的字符串,如果没有任何字符串,则返回空字符串。
要解决此任务,您需要使用集合。由于集合具有快速的成员资格测试功能,因此可以有效地跟踪已看到的和重复的元素。
我的解决方案是:
def find_unique_string(words):
last_uniq = ''
seen = set()
for w in words:
if last_uniq == w:
last_uniq = ''
if w not in seen:
last_uniq = w
seen.add(w)
return last_uniq
测试用例是:
print(find_unique_string(['apple', 'banana', 'apple', 'mango', 'banana'])) # It should print: 'mango'
print(find_unique_string(['hello', 'world', 'hello'])) # It should print: 'world'
print(find_unique_string(['hello', 'world', 'hello', 'world'])) # It should print: ''
print(find_unique_string([])) # It should print: ''
print(find_unique_string(['apple', 'banana', 'apple', 'kiwi', 'banana', 'kiwi'])) # it should print ''
CodeSignal AI 不接受我的代码作为解决方案,并报告它不正确,但它无法提供我的代码结果错误的任何情况。
现在我的问题:
谁是对的?我还是 CodeSignal AI?
如果我是对的,我如何向 CodeSignal AI 证明我是对的,以便我可以通过测试并进入下一个测试?
如果 AI 是正确的,你能给我一个示例测试用例,它会破坏我的代码并且不会生成预期的输出吗?
我不希望你编写一个有两组的解决方案,一组用于看到,一组用于重复,因为这是人工智能期望的结果(我认为),但我想知道我的代码是否正确以及是否正确是,如何证明是,或者你有一个测试用例来证明我的代码是错误的。
一种选择是分两步完成此操作。 首先,使用
Counter
查找每个列表条目的计数。 然后,使用列表理解来过滤掉任何多次出现的列表元素。
from collections import Counter
inp = ['apple', 'banana', 'apple', 'mango', 'banana']
counts = Counter(inp)
u_list = [item for item in inp if count[item] == 1]
print(u_list[-1])