给定两个数组,我需要找到最长的公共后缀。
更确切地说,我需要在每个数组中找到索引,然后出现该后缀。
例如:
// Input
arr1 = [1,2,3,4,5,6];
arr2 = [11,12,13,5,6];
// Output
ind1 = 4;
ind2 = 3;
这是我的代码:
let ind1 = arr1.length - 1;
let ind2 = arr2.length - 1;
while (ind1 >= 0 && ind2 >= 0 && arr1[ind1] == arr2[ind2]) {
ind1--;
ind2--;
}
ind1++;
ind2++;
我可以在这里申请一个单一陈述技巧(或一般的“清洁”方式)吗?
非常感谢。
答案 0 :(得分:1)
这绝对不是单语句技巧或清除方法,但它实际上比现有代码要多得多。
根据讨论:
如果数组如下所示:[1,2,3,4,5,6,7,8,9],[1,2,6,5,4,7,8,9]? - Rajesh
@Rajesh:试试代码。它应该给你ind1 = 0和ind2 = 0. - goodvibration
@goodvibration我需要找到最长的公共后缀,所以最长的后缀是7,8,9而不是1,2 - Rajesh
哦,对不起,我认为他们的例子相同。是的,这里的后缀是7,8,9,所以输出应该是ind1 = 6而ind2 = 5. - goodvibration
您正在寻找一个返回最大序列的起始索引的逻辑。为此,您必须捕获所有序列并在返回索引之前检查它们的长度。
您可以尝试以下逻辑:
if(![variantEdge[@"node"][@"image"][@"src"] isEqual:[NSNull null]])
{
NSString *variantImageUrl = variantEdge[@"node"][@"image"][@"src"];
}

答案 1 :(得分:0)
您可以使用单个变量从数组末尾开始计数。
var array1 = [1, 2, 3, 4, 5, 6],
array2 = [11, 12, 13, 5, 6],
l1 = array1.length - 1,
l2 = array2.length - 1,
i = 0;
while (i <= l1 && i <= l2 && array1[l1 - i] === array2[l2 - i]) {
i++;
}
console.log('index array1', l1 - i + 1);
console.log('index array2', l2 - i + 1);
&#13;
答案 2 :(得分:0)
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import net.minidev.json.JSONArray;
/**
* Matcher that can be used to detect if a value is null or refers to an empty list,
* or a list that contains a single null value.
*
* @param <T>
*/
public class IsNullOrEmpty<T> extends BaseMatcher<T> {
@Override
public boolean matches(Object item) {
System.out.println(item.getClass().getPackage());
if(item instanceof JSONArray) {
JSONArray arr = ((JSONArray)item);
return arr==null || arr.size()==0 || (arr.size()==1 && arr.get(0)==null);
}
return item==null;
}
@Override
public void describeTo(Description description) {
description.appendText("null or list of null");
}
/**
* Detect if the value is null or contains an empty array, or an array of a single element
* of null
* @return
*/
public static Matcher<Object> isNullOrEmpty() {
return new IsNullOrEmpty<>();
}
}
代替~ind1
作为ind1 >= 0
的缩写:
ind1 != -1
可以移动减量以避免while (~ind1 && ~ind2 && arr1[ind1] == arr2[ind2]) { ind1--; ind2--; }
(两次递减都需要.length - 1
):
&
对于数值,条件可以更短,因为var i = arr1.length, j = arr2.length; while (~--i & ~--j && arr1[i] == arr2[j]) { }
是undefined - undefined
:
NaN
我把每一行放在一行上与原版进行比较,对于这个烂摊子感到抱歉..
while (arr1[--i] - arr2[--j] == 0) { }
&#13;
作为旁注,我希望通用后缀函数返回一个字符串或多个字符。