【问题标题】:Return True if an array has a 2 directly next to another 2如果一个数组有一个 2 紧挨着另一个 2,则返回 True
【发布时间】:2017-03-11 22:32:10
【问题描述】:

给定一个整数数组,如果该数组在某处的某个 2 旁边包含一个 2,则返回 True。

has22([1, 2, 2]) → 真

has22([1, 2, 1, 2]) → 假

has22([2, 1, 2]) → 假

我的尝试是:

def has22(nums):
    if 2 in nums:
        if (nums[nums.index(2) + 1] == 2):
            return True
        elif (nums[nums.index(2) - 1] == 2):
            return True
        else:
            return False
    else:
        return False

这导致Error: list index out of range。如果有人能解释为什么会发生这种情况,我们将不胜感激。

【问题讨论】:

  • 如果 2 是第一个或最后一个数字怎么办?这将超出范围...
  • 是的,我想我假设如果它导致越界,它只会移动到下一个 if else 语句。关于如何实现这一目标的任何想法?
  • 您可以将条件语句包装在 try: ... except IndexError: pass 中以忽略异常。

标签: python arrays algorithm list python-3.x


【解决方案1】:

首先,pairwise()。然后:

any(x == y == 2 for (x, y) in pairwise(seq))

【讨论】:

    【解决方案2】:

    我喜欢pairwise 的想法,这里是其他的,没有导入任何东西

    any( seq[i-1] == seq[i] == 2 for i in range(1,len(seq)) )
    

    您的代码的问题在于,不仅当 2 是第一个或最后一个元素时会失败,而且当这对 2 与前 2 不同时也会失败,例如 [1,2,3,2 ,2] 因为.index 只给你前2的第一个位置。

    解决方案很简单,要求一个你知道会在那里的索引,如上面的示例所示,从 1 开始要求所有索引和前一个索引,所以在你第一次要求索引 0 和 1 时,然后1和2,以此类推

    【讨论】:

      【解决方案3】:

      如果输入是小sequence:

      any(a == b == 2 for a, b in zip(seq, seq[1:]))
      

      【讨论】:

        【解决方案4】:

        解决办法

        def has22(a, i = 0):
          if(i < len(a) - 1):
            if(a[i] == 2 and a[i+1] == 2):
              return True
            return has22(a, i + 1)
          return False
        

        【讨论】:

          猜你喜欢
          • 2015-06-29
          • 1970-01-01
          • 1970-01-01
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 2016-08-01
          • 2017-02-06
          • 2011-05-03
          相关资源
          最近更新 更多