【问题标题】:Codefights areSimilar challenge in python3代码战是 python3 中的类似挑战
【发布时间】:2017-06-25 00:27:53
【问题描述】:

我在使用 python3 的 CodeFights 上遇到“areSimilar”问题。

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 请发布您当前的尝试
  • 需要您的代码来执行此操作。请张贴。
  • 并发布挑战的链接。
  • def areSimilar(a, b): if set(a) != set(b): return False for i in range(len(a)): if a[i] != b[ i]: count += 1 count = 0 if count == 0 or count == 2: return True return False

标签: arrays python-3.x set


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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】:

      你可以试试这个代码。我通过了所有的案例。

      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
      

      【讨论】:

        【解决方案4】:

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

        第一种方法

        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
        

        【讨论】:

          【解决方案5】:

          这是我的代码,但我不知道我可以做更多的事情来获得更多的速度..

          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
          

          【讨论】:

            【解决方案6】:
            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))
            

            我的代码通过了所有测试

            【讨论】:

              【解决方案7】:

              单线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
              

              【讨论】:

                【解决方案8】:

                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;
                    
                }
                

                【讨论】:

                  【解决方案9】:

                  简单的 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)]
                  

                  【讨论】: