有一个简单的练习:
在求职面试中,您面临编写一个算法来检查给定字符串s是否可以由其他两个字符串part1和part2构成的挑战。 限制是part1和part2中的字符与s中的顺序相同。 面试官为您提供以下示例,并告诉您从给定的测试用例中找出其余的内容。
例如:
'codewars'是'cdw'和'oears'的合并:
s:密码=代码战
part1:c d w = cdw
第2部分:OE =耳朵
好的,所以我的代码是:
def is_merge(s, part1, part2):
if len(s) != (len(part1) + len(part2)):
return False
l= list(s)
p1=list(part1)
p2=list(part2)
l= sorted(l)
result= p1+p2
result= sorted(result)
if result == l:
return True
所以55/66结果是正确的,但是在11种情况下,存在以下特定错误:
现在是错误(我知道它们不够详细,但这就是本代码战练习所告诉我的)
is_merge
can handle characters in wrong order:
#codewars can't be created from code and wasr
#codewars is not a merge of cwdr and oeas
can handle some random cases (11 of 20 Assertions)(here are 9 errors where they all say:
#Can we merge it? No, we can't: None should equal False)
有任何提示,以便我可以找出我在这段代码中写错了什么还是没有添加什么?
答案 0 :(得分:1)
在函数的核心中,您可以尝试这样的循环:
part1_index = 0
part2_index = 0
for c in l:
if part1_index < len(p1) and c == p1[part1_index]:
part1_index += 1
elif part2_index < len(p2) and c == p2[part2_index]:
part2_index += 1
else:
return False
return True
答案 1 :(得分:0)
订单很重要-做sorted(l)
和sorted(result)
会导致订单被打乱,从而导致订单被破坏。
如果我理解正确,
限制是part1和part2中的字符与s中的顺序相同。
意味着您需要依次遍历part1
和part2
那可以解释为什么会得到
的错误无法通过代码和wasr创建代码战
答案 2 :(得分:0)
如上所述,字母顺序很重要。您可以使用find
在字符串中找到字符的第一个位置。此功能有效,但如果所需单词重复的字符会中断:
def is_merge(s, part1, part2):
if len(s) != (len(part1) + len(part2)):
return False
# where are the characters in the desired string?
part1_pos = [s.find(x) for x in part1]
part2_pos = [s.find(x) for x in part2]
# are they in order? i.e. does the position keep increasing?
part1_increases = [x < y for x,y in zip(part1_pos,part1_pos[1:])]
part2_increases = [x < y for x,y in zip(part2_pos,part2_pos[1:])]
# these prints will show you what is going on ...
print(part1_pos,part1_increases)
print(part2_pos,part2_increases)
if all(part1_increases) and all(part2_increases):
return True
return False
答案 3 :(得分:0)
def is_merge(s, s1, s2):
for c in s:
if s1.startswith(c):
s1 = s1[1:]
elif s2.startswith(c):
s2 = s2[1:]
else:
return False
else:
if s1 or s2: # still characters left in s1 or s2
return False
return True