【问题标题】:Finding all contiguous subarrays查找所有连续子数组
【发布时间】:2020-12-02 12:13:46
【问题描述】:

这里我有一个 elementList,它保存只有 0 和 1 的数据。我将数据从 elementList 扔到temporaryList 以检查所有子数组。 我正在尝试查找仅包含一个 '1' 的连续子数组的总数。

我通过打印子数组来检查它们是否正确。它们很好,但是我的 subarrayCounter 没有给出正确的值,而且我看不到我的问题(我确信这是一个愚蠢的错误,抱歉)。

任何想法都可以。谢谢

for i in range (0,len(elementlist)):
    maxwidth = len(elementlist)  - i 
    for j in range (0 , maxwidth):
        tempList.append(elementlist[i+j])
   
        for m in range (0 , len(tempList)) : 
            if tempList[m] == '1' : 
                counter += 1

        if counter == int(numberOne) : 
            subarrayCounter += 1
        counter = 0
    
        
            
    tempList.clear()

例如,当我的列表中有 0 1 1 0 1 时,如果我尝试打印连续子数组时,它会给出正确答案:

    for i in range (0,len(elementlist)):
        maxwidth = len(elementlist)  - i 
        for j in range (0 , maxwidth):
            tempList.append(elementlist[i+j])
            print(tempList) # added print here
            for m in range (0 , len(tempList)) : 
                if tempList[m] == '1' : 
                    counter += 1

            if counter == int(numberOne) : 
                subarrayCounter += 1
            counter = 0
    
        
            
        tempList.clear()

输出:

    ['0']
    ['0', '1']
    ['0', '1', '1']
    ['0', '1', '1', '0']
    ['0', '1', '1', '0', '1']
    ['1']
    ['1', '1']
    ['1', '1', '0']
    ['1', '1', '0', '1']
    ['1']
    ['1', '0']
    ['1', '0', '1']
    ['0']
    ['0', '1']
    ['1']

【问题讨论】:

  • 顺便说一句,我认为您可以在这里使用滑动窗口方法。
  • 你不能只检查 counter>=1 然后增加 subarrayCounter 吗?
  • 看看itertools.groupby。可以将子数组转化为单项,过滤掉0值,统计结果。
  • 你需要找到子数组的数量吗?
  • 看我的回答here。您的问题是 k=1 的简化版本

标签: python algorithm sub-array


【解决方案1】:

我认为下面的代码是解决这个问题的简单方法。

def countSubArraysWithSingle1(elementlist):
  subarrayCounter = 0
  for i in range (0,len(elementlist)):
    for j in range (i , len(elementlist)):
      if elementlist[i:j+1].count('1') == 1:
        print(elementlist[i:j+1])
        subarrayCounter += 1
  print("Total count: ",subarrayCounter)

I/P: ['0', '1', '1', '0', '1']
O/P:

['0', '1']
['1']
['1']
['1', '0']
['0', '1']
['1']
Total count: 6

说明:
该代码按以下顺序找出所有子数组,并在每个子数组上运行一个计数函数,该函数计算其中“1”的数量并返回计数。我们检查返回的计数是否为 1,如果是,则将 subarrayCounter 加 1:

['0'].count('0') => 0
**['0', '1'].count('1') => 1 {increment subarrayCounter by 1}**
['0', '1', '1'].count('1') => 2
['0', '1', '1', '0'].count('1') => 2
['0', '1', '1', '0', '1'].count('1') = 3
**['1'].count('1') => 1 {increment subarrayCounter by 1}**
['1', '1'].count('1') => 2
['1', '1', '0'].count('1') => 2
['1', '1', '0', '1'].count('1') => 3
**['1'].count('1') => 1 {increment subarrayCounter by 1}**
**['1', '0'].count('1') => 1 {increment subarrayCounter by 1}**
['1', '0', '1'].count('1') => 2
['0'].count('1') => 0
**['0', '1'].count('1') => 1 {increment subarrayCounter by 1}**
**['1'].count('1') => 1 {increment subarrayCounter by 1}**

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2015-11-05
    • 2015-11-01
    • 1970-01-01
    • 2020-06-24
    • 2013-09-13
    • 1970-01-01
    • 2017-05-25
    • 2015-07-27
    • 2019-07-27
    相关资源
    最近更新 更多