Codefights是python3中的类似挑战

时间:2017-06-25 00:27:53

标签: arrays python-3.x set

我遇到了" areSimilar" CodeFights上使用python3的问题。

提示状态"如果可以通过交换其中一个数组中的至多一对元素从另一个数组获得一个数组,则称为两个数组相似。

给定两个数组a和b,检查它们是否相似。"

例如,[1,1,2]和[1,2,1]会通过测试,因为您可以在两个列表中交换两个元素来模拟另一个元素。

但是,[3,4,5]和[4,5,3]没有通过测试,因为你无法交换任何一个列表中的两个元素,使它看起来像另一个。

两个列表的长度始终相同,长度大于2。

我当前的代码通过了除一个隐藏测试之外的所有测试,我想知道是否有人可以指导我完成一个过程来帮助我解决这个问题。

谢谢!

9 个答案:

答案 0 :(得分:3)

我的旧代码也未通过最后一次隐藏测试,我意识到交换功能有问题 我的旧交换功能是:

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]

如果我与前9名交换5,那就不会是正确的......

这是我更改交换功能后的新代码

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

答案 1 :(得分:2)

您可以尝试使用此代码。我通过了所有案件。

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

答案 2 :(得分:1)

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]]

通过所有测试...

答案 3 :(得分:0)

这是我的代码,但我不知道我能做些什么来获得更多的速度..

def areSimilar(a, b):

    swap = False
    for i, x, y in zip(range(len(a)), a, b):  
        if x == y:
            pass

        elif (x != y) and (swap == False):

            try:
                k = b.index(x)
            except:
                return False

            b[k] = y
            swap = True

        else:
            return False

    return True

答案 4 :(得分:0)

def areSimilar(a, b):
tmp1=list()
tmp2=list()
for i in range(len(a)):
    if a[i]!=b[i]:
        tmp1.append(a[i])
        tmp2.append(b[i])
if len(tmp1)==0:
    return True
elif len(tmp1)>2:
    return False
else:
    return tmp1==list(reversed(tmp2))

我的代码通过了所有测试

答案 5 :(得分:0)

下面是我的代码,这是不言自明的,并且通过了所有测试用例。

第一种方法

def areSimilar(a, b):
    if set(a) != set(b):
        return False

    if sorted(a) != sorted(b):
        return False

    diffs = [ix for ix,val in enumerate(list(zip(a,b))) if val[0] != val[1]]

    if len(diffs) not in(0,2):
        return False

    return True

第二种方法

def areSimilar(A, B):
    return sorted(A)==sorted(B) and sum([a!=b for a,b in zip(A,B)])<=2

答案 6 :(得分:0)

一个内衬python解决方案

from collections import Counter as C

def areSimilar(A, B):
    return C(A) == C(B) and sum(a != b for a, b in zip(A, B)) < 3

答案 7 :(得分:0)

C# 解决方案

bool areSimilar(int[] a, int[] b) 
{
    int n = a.Length;
    int differences = 0;
    
    for(int i=0; i<n; i++)
    {
        if(a[i] != b[i]) differences++;
    }
    
    if(differences == 0) return true;
    
    Array.Sort(a);
    Array.Sort(b);
    
    bool same = a.SequenceEqual(b);
    
    return (differences <= 2) && same;
    
}

答案 8 :(得分:0)

简单的 Python 3:

def areSimilar(a, b):
    import numpy as np
    if a == b:
        return True
    diff = np.array(a) - np.array(b)
    return [False, True][list(diff).count(0) == len(diff) - 2 and sum(list(diff)) == 0 and set(a) == set(b)]