【问题标题】:Whats wrong in my subsequence validation?我的子序列验证有什么问题?
【发布时间】:2022-01-22 14:38:51
【问题描述】:

我正在尝试使用此函数来检查列表 SEQUENCE 是否是列表 ARRAY 的子序列。子序列的意思是:必须有所有的数字,并且它们必须是相同的顺序。在下面的示例中,SEQUENCE 是 ARRAY 的子序列。 数组=[5, 1, 22, 25, 6, -1, 8, 10] 序列= [1, 6, -1, 10]

谁能告诉我为什么我的代码不起作用?

array=[5, 1, 22, 25, 6, -1, 8, 10] 
sequence= [1, 6, -1, 10]

def isValidSubsequence(array, sequence):
arrayValid=[]
if len(array) >= len(sequence):
    for i in range(len(sequence)):
        numSeq = sequence[i]
        for j in range(i, len(array)):
            numArr = array[j]
            if numSeq==numArr:
                arrayValid.append(numArr)
                array.remove(numArr)
            else:
                array.remove(numArr)
    if arrayValid==sequence:
        return True
    else:
        return False
else:
        return False

【问题讨论】:

    标签: python for-loop append sequence


    【解决方案1】:

    您在 j (for j in range(i, len(array)):) 上的循环从对应于序列中某个位置的索引开始。通过数组前进必须独立于序列中值的索引。

    您可以使用迭代器来做到这一点:

    array=[5, 1, 22, 25, 6, -1, 8, 10] 
    sequence= [1, 6, -1, 10]
    
    iArray = iter(array)
    isSubsequence = all(s in iArray for s in sequence)
    
    print(isSubsequence) # True
    

    s in iArray 部分将迭代器 (iArray) 推进到找到 s 的位置。如果array包含sequence的所有元素以相同的顺序排列,那么sequence中的每个s都可以前进到iArray中的一个匹配值。

    【讨论】:

      【解决方案2】:

      解决方案 1

      public static boolean isValidSubsequence(List<Integer> array, List<Integer> sequence) {
          int sqInt = 0, arInt = 0;
              while (sqInt < sequence.size() && arInt < array.size()) {
      
                  if (sequence.get(sqInt).equals(array.get(arInt))) {
                         sqInt++;
                  }
                  arInt++;
              }
              return sqInt==sequence.size();
        }
      

      解决方案 2

      public static boolean isValidSubsequence(List<Integer> array, List<Integer> sequence) {
         int sqInt=0;
              for(Integer val:array){
                    if(sqInt==sequence.size()){
                          break;
                      }
                    if(sequence.get(sqInt).equals(val)){
                           sqInt++;
                      }
              }
          return sqInt==sequence.size();
        }
      

      解决方案 3

      public static boolean isValidSubsequence(List<Integer> array, List<Integer> sequence) {
           int sqInt=0;
              for(Integer val:array){
                    if(sqInt==sequence.size()){
                          break;
                      }
                    if(sequence.contains(val)){
                           sqInt++;
                      }
              }
          return sqInt==sequence.size();
        }
      

      【讨论】:

        猜你喜欢
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-12
        相关资源
        最近更新 更多