我的后续验证有什么问题?
Whats wrong in my subsequence validation?
我正在尝试使用此函数来检查列表 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
您在 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中的匹配值。
解决方案 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();
}
我正在尝试使用此函数来检查列表 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
您在 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中的匹配值。
解决方案 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();
}