找到两个数组最长公共后缀的最佳方法

时间:2017-11-21 10:31:11

标签: javascript arrays

给定两个数组,我需要找到最长的公共后缀。

更确切地说,我需要在每个数组中找到索引,然后出现该后缀。

例如:

// 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++;

我可以在这里申请一个单一陈述技巧(或一般的“清洁”方式)吗?

非常感谢。

3 个答案:

答案 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

您正在寻找一个返回最大序列的起始索引的逻辑。为此,您必须捕获所有序列并在返回索引之前检查它们的长度。

您可以尝试以下逻辑:

  • 创建一个可以保留位置的临时对象。
  • 现在循环遍历数组。
    • 如果未定义Array1的起始位置,请查找匹配元素的索引。
    • 将此索引保存在临时对象中并继续。
    • 如果定义了startPosition,请在两个数组中查找下一个值相等。
    • 如果相等,请继续。
    • 如果没有,请创建一个组并从该索引再次启动该过程。



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;
&#13;
&#13;

答案 2 :(得分:0)

可以使用{p> 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

我把每一行放在一行上与原版进行比较,对于这个烂摊子感到抱歉..

&#13;
&#13;
while (arr1[--i] - arr2[--j] == 0) { } 
&#13;
&#13;
&#13;

作为旁注,我希望通用后缀函数返回一个字符串或多个字符。