我在使用python3的CodeFights上遇到了"areSimilar“问题。
提示符指出“两个数组称为相似,如果一个数组可以通过交换其中一个数组中的至多一对元素从另一个数组中获得。
给定两个数组a和b,检查它们是否相似。
例如,1,1,2和1,2,1将通过测试,因为您可以在任何一个列表中交换两个元素来模拟另一个元素。
但是,3,4,5和4,5,3不能通过测试,因为您不能交换列表中的两个元素来使其看起来像另一个列表。
这两个列表的长度将始终相同,并且长度大于2。
我当前的代码通过了所有的测试,除了一个隐藏的测试,我想知道是否有人可以指导我通过一个过程来帮助我通过这个问题。
谢谢!
发布于 2017-11-08 06:02:08
我的旧代码也没能通过上一次隐藏测试,我意识到交换函数有一个问题,我的旧交换函数是:
def swp(i,a,b):
s = 0
item = a[i]
if item in b:
indx = b.index(item)
s = b[i]
b[i] = b[indx]
b[indx] = s
return -1
else:
return -2
想一下,如果:
a = [2,9,6,8,9,5]
b = [2,5,6,8,9,9]
如果我把5换成前9,那就不对了…
这是我在更改交换函数后的新代码
def swp(i,a,b):
s = 0
item = a[i]
if item in b:
for j in range(len(b)):
if b[j] == a[i] and b[j] != a[j]:
indx = j
s = b[i]
b[i] = b[indx]
b[indx] = s
return -1
else:
return -2
def check(a,b):
for i in range(len(a)):
if a[i] != b[i]:
return i
return -1
def areSimilar(a, b):
if check(a,b) != -1:
i = check(a,b)
if swp(i,a,b) == -1:
swp(i,a,b)
if check(a,b) != -1:
return False
else:
return False
return True
发布于 2018-12-04 18:30:44
def areSimilar(a, b):
i = 0
i_val = []
while i < len(a):
if a[i] != b[i]:
i_val.append(i)
i += 1
if not i_val:
return True
if len(i_val) != 2:
return False
return a[i_val[0]] == b[i_val[1]] and a[i_val[1]] == b[i_val[0]]
通过了所有的测试。
发布于 2018-06-24 08:07:37
你可以试试这段代码。我通过了所有的案子。
def areSimilar(a, b):
count = 0
list_a = []
list_b = []
for i in range(len(a)):
if (a[i]!= b[i]):
count +=1
list_a.append(a[i])
list_b.append(b[i])
if (count ==0):
return True
elif count ==2:
return set(list_a)==set(list_b)
else:
return False
https://stackoverflow.com/questions/44742127
复制相似问题