查找两个列表的合并点

2016年9月2日

给定两个列表,合并点是两个列表相同并可以合并的点。例如,给定列表(a b c x y z)和(g h i x y z。如果两个列表中的最后一项不同,则合并点为空;如果两个列表相同,那么整个列表就是合并点。

你的任务是编写一个程序,找到两个列表的合并点;它应该返回第一个列表的唯一前缀、第二个列表的惟一前缀和两个列表的公共后缀。完成后,欢迎您阅读运行建议的解决方案,或者发布你自己的解决方案,或者在下面的评论中讨论这个练习。

页:1 2

11对“找到两个列表的合并点”的回应

  1. 丹尼尔

    这里有一个Java解决方案。

    导入java.util。数组列表;导入java.util。收藏;导入java.util。列表;公共类MergePoint{公共静态类结果<T>{public List<T>prefix1=新的ArrayList<>();public List前缀=新ArrayList();public List后缀=new ArrayList();}公共static<T>结果<T>合并点(列表<T>l1,列表<T>l2){结果<T>结果=新结果<>();int后缀_len=0;while(真){int索引1=l1.size()-1-后缀_len;int索引2=l2.size()-1-后缀_len;if(index1<0|index2<0)中断;如果(!l1.get(index1).equals(l2.get(index 2)))中断;++后缀_len;}for(int i=0;i<l1.size()-后缀_len++i)result.prefix1.add(l1.get(i));for(int i=0;i<l2.size()-后缀_len++i)result.prefix2.add(l2.get(i));for(int i=l1.size()-后缀_len;i<l1.size()++i)result.后缀.add(l1.get(i));返回结果;}公共静态void main(String[]args){列表<Character>l1=新数组列表<>();集合.addAll(l1,'a','b','c','x','y','z');列表<Character>l2=新数组列表<>();集合.addAll(l2,'g','h','i','x','y','z');结果<字符>结果=合并点(l1,l2);System.out.print(“列表1唯一前缀\n”+result.prefix1+“\n\n”);System.out.print(“列出2个唯一前缀”+result.prefix2+“\n\n”);System.out.print(“公共后缀”+result.Suffix+“”);}}

    输出:

    列表1唯一前缀[a,b,c]列表2唯一前缀【g,h,i】通用后缀[x,y,z]
  2. 扎克

    这里是Julia的一个实例(执行时间为0.000088秒,总共应用64个内存分配)。

    函数main{T=ny
    x、 y=x _,y_
    其他的
    x、 y=y,x_
    nx,ny=ny,nx
    结束

    dn=ny–nx#长度负差

    对于i=(nx–ny+1):(nx-1)
    j=dn+i

    如果全部(x[i:end].==y[j:end])
    返回x[1:(i-1)],y[1:(j-1)],x[i:结束]
    结束
    结束

    返回x_,y_,数组(T,0)
    结束

    此代码针对不相等列表进行了优化,尽管它在相等列表上的工作速度也很快。像往常一样,没有使用外部库。

  3. 扎克

    由于某些原因,代码没有正确粘贴。这又是一个.png文件:https://app.box.com/s/0fhupoyexwx26dv6trb7ud8mgs30ntz9

  4. 在Common Lisp中:

    (拆除合并点(lst1 lst2)(let(res(合并点帮助器(反向lst1))(反向lst2)无))(列表(nreverse(car res))(反向(cadr res))(caddr res)))(卸下合并点帮助器(lst1 lst2通用)(如果(或(空lst1))(空lst2))(列出lst1 lst2通用)(如果(等于(车厢lst1)(车厢lst2))(分叉点(cdr lst1)(cdr lst2)(cons(car lst1)通用)(列出lst1 lst2通用)))

    一些测试:

    CL-USER>(合并点“(a b c x y z)”(g h i x y z”)((A B C)(G H I)(X Y Z))CL-USER>(合并点“(y z)”(g h i x y z))(零(G H I X)(Y Z))
  5. 我上一条评论中有一个错误,代码是:

    (拆除合并点(lst1 lst2)(let(res(合并点帮助器(反向lst1))(反向lst2)无))(列表(nreverse(car res))(反向(cadr res))(caddr res)))(卸下合并点帮助器(lst1 lst2通用)(如果(或(空lst1))(空lst2))(列出lst1 lst2通用)(如果(等于(车厢lst1)(车厢lst2))(合并点帮助(cdr lst1)(cdr lst2)(cons(car lst1)通用)(列出lst1 lst2通用)))
  6. 保罗

    在Python3中。

    从itertools导入zip_longest定义合并点(a,b):ita,itb=反转(a),反转(b)后缀,前缀,前缀b=[],[],[]对于zip_longest(ita,itb)中的x,y:如果x!=年:如果x:前缀.append(x)if y:前缀.append(y)打破其他:后缀.append(x)前缀+=ita前缀b+=itb返回前缀[::-1],前缀b[::-1-,后缀[::-1]r5=[1、2、3、4、5]测试=[(r5,[6,7,3,4,5]),([1,2,3,4,8],[6,7,3,4,5]),(r5,r5),(r5、[3、4、5])]对于测试中的t:打印(“输入:{:40s}输出:{:s}”。格式(str(t),str(合并点(*t)))"""输入:([1,2,3,4,5],[6,7,3,4,5])输出:([1,2],[6,7],[3,4,5])输入:([1,2,3,4,8],[6,7,3,4,15])输出:([1,2,3,4],[6,17,3,14,5],[])输入:([1,2,3,4,5],[1,2,3,4,15])输出:([],[],[1,2,3,4,5])输入:([1,2,3,4,5],[3,4,15])输出:([1,2],[],[3,4,5])输入:([3,4,5],[1,2,3,4,15])输出:([],[1,2],[3,4,5])输入:([1,3,4,5],[1,2,3,4,5])输出:([1],[1,2],[3,4,15])"""
  7. 斯科特

    (拆除合并点(lst1 lst2)
    (do((l1(反向lst1)(cdr l1))
    (l2(反向lst2)(cdr l2))
    (合并点'())
    (或(和(空l1)(空l2))
    (值(反向l1)(反向l2)合并点)
    (推(车l1)合并点)

  8. 阿克沙亚·潘迪

    包装试验;

    公共类MergePoint{
    公共静态int mergePoint(int a[],int b[]){
    int aMergePoint=a.length;
    int bMergePoint=b.length;
    int alength=a.length;
    int blength=b.length;

    对于(int i=alength-1,j=blength-1;i>=0&j>=0&#xA0;a[i]==b[j];i–,j–){
    a合并点–;b合并点–;
    }
    System.out.println(“\n aMergePoint”+aMerge点);
    System.out.println(“后缀”);
    for(int i=aMergePoint;i<a.length;i++){
    System.out.print(a[i]);
    }
    System.out.println(“\nAPrefix”);
    for(int i=0;i<aMergePoint;i++){
    System.out.print(a[i]);
    }
    System.out.println(“\nBPrefix”);
    for(int i=0;i<bMergePoint;i++){
    System.out.print(b[i]);
    }
    for(int i=合并点;i<合并点;i++){
    System.out.print(a[i]);
    }
    返回aMergePoint;
    }
    公共静态void main(字符串参数[]){
    整数a[]={1,2,3,4,5,6,7,8,9};
    整数b[]={5,6,7,4,5,6,1,7,8,9};
    合并点(a,b);
    }
    }

  9. 扎克

    @杰罗姆。很好地在Lisp中实现了这一点;没有多少人能应付得了!这让我想起了我的大学时代,那时我自己草草写了几个Lisp脚本。我很好奇这门语言在这项任务中的表现,所以如果能提供任何有关这方面的信息,我将不胜感激。

  10. 约翰

    在Common Lisp中,使用内置函数MISMATCH和SUBSEQ:

    (删除合并点(xs-ys&key(test#'eql))(let(m(长度xs))(n(长度ys))(i(不匹配(反向xs)(反向ys):测试测试))(如果(null i)(值()()xs)(值(subsq xs 0(-m i))(第ys0(-ni)小节)(第xs(-mi)小节))
  11. 阿基利斯·佩尼亚

    在PHP中

    函数find_merge($A,$B){
    $a=数组值($a);
    $b=数组值($b);
    $l=大小($A);
    $merge=true;
    对于($i=0;$i<$l;$i++){
    如果($a[$i]==$b[$i]){
    if($merge){
    $mp=$i;
    $merge=false;}
    }否则{$merge=true;
    $mp=$l;}
    }
    $bb=数组切片($b,0,$mp);
    $aa=数组切片($a,0,$mp);
    $am=数组切片($a,$mp);
    返回print_r([$aa,$bb,$am]);
    }

留下评论