考道前端 iOS 算法题( Easy) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nagato
V2EX    问与答

考道前端 iOS 算法题( Easy)

  •  1
    nbsp;
  •   nagato 2016-11-27 14:02:39 +08:00 3016 次点击
    这是一个创建于 3247 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给你两个 UIView 或者其子类的对象 viewAviewB.

    如果它们同属一个父view的话, 请找到并返回这个父 view, 否则请返回nil.

    - (UIView *) findCommonSuperViewBetween: (UIView *)viewA and: (UIView *)viewB { } 

    大家先写,一会儿贴下我写的答案。

    第 1 条附言    2016-11-27 18:04:59 +08:00
    要求返回的是最低的父 view
    第 2 条附言    2016-11-27 18:11:09 +08:00

    贴下我的代码:

    - (UIView *) findCommonSuperViewBetween: (UIView *)viewA and: (UIView *)viewB { if (viewA == nil || viewB == nil) return nil; UIView *tempA = viewA; UIView *tempB = viewB; while (tempA != tempB) { tempA = tempA == nil? viewB: [tempA superview]; tempB = tempB == nil? viewA: [tempB superview]; } return tempA; } 
    21 条回复    2016-12-01 02:25:38 +08:00
    xieguobihaha
        1
    xieguobihaha  
       2016-11-27 17:15:32 +08:00
    我的思路是将 viewA 和 viewB 的所有父 view 分别放入两个数组,数组数量少的那个说明位于视图上层,取它的第一个父视图即可,代码如下
    https://gist.github.com/hiXgb/6cf33f97fa2439a44d23be3e4691b16e
    starqoq
        2
    starqoq  
       2016-11-27 17:29:19 +08:00 via Android
    求 lca ?
    xieguobihaha
        3
    xieguobihaha  
       2016-11-27 17:30:18 +08:00
    nagato
        4
    nagato  
    OP
       2016-11-27 17:31:17 +08:00
    @starqoq 哈哈哈,比 LCA 还要简单好多
    nagato
        5
    nagato  
    OP
       2016-11-27 17:35:49 +08:00
    @xieguobihaha 说实话有点惨不忍睹,面试应该是挂的
    xieguobihaha
        6
    xieguobihaha  
       2016-11-27 17:39:43 +08:00
    @nagato 求指教
    kimown
        7
    kimown  
       2016-11-27 17:41:30 +08:00 via Android
    题目真没看懂, uiview ,这是前端?
    xieguobihaha
        8
    xieguobihaha  
       2016-11-27 17:51:47 +08:00
    @nagato 我自己发现一个错误了, while 循环里最后跳出条件得改一下,不然死循环了。
    nagato
        9
    nagato  
    OP
       2016-11-27 17:57:52 +08:00
    @xieguobihaha
    且不说你做的是不是正确。单从你的代码就能看出你的编码能力还挺一般的. 比如你想把所有的 superview 全加数组里,为啥可以写出这么多代码和变量,不是两个 while loop 就好了吗
    不过我挺喜欢你的态度
    nagato
        10
    nagato  
    OP
       2016-11-27 18:00:30 +08:00
    @kimown iOS

    其实换个讲法。 给 classA, classB ,求 lowest common super class , 应该对哪个语言都适用
    wy315700
        11
    wy315700  
       2016-11-27 18:04:47 +08:00
    @nagato 其实就是 求两个单链表是否相交的问题吧。。。。
    binux
        12
    binux  
       2016-11-27 18:06:45 +08:00 via Android
    多重继承怎么办
    nagato
        13
    nagato  
    OP
       2016-11-27 18:07:12 +08:00
    @wy315700 哈哈对的,想到这个就差不多了
    nagato
        14
    nagato  
    OP
       2016-11-27 18:09:37 +08:00
    @binux 你厉害
    fengyunSmlie
        15
    fengyunSmlie  
       2016-11-27 18:14:51 +08:00
    菜鸟前来膜拜大佬
    a412739861
        16
    a412739861  
       2016-11-27 18:14:52 +08:00
    贴个现成的吧。源代码在 Masonry 中,查看 View+MASAdditions.h/m 文件即可。

    这是个实例方法,类方法也一样;只是 self 变成 view1 罢了。

    遍历 self 的 superview ,去匹配 view 。
    然后取 view 得 superview ,再遍历一遍 self 的 superview 。循环不到,也就返回 nil 了。
    记得回复不能 markdown 的样子,就直接复制下代码,不会太好看。

    - (instancetype)mas_closestCommonSuperview:(MAS_VIEW *)view {
    MAS_VIEW *closestCommOnSuperview= nil;

    MAS_VIEW *secOndViewSuperview= view;
    while (!closestCommonSuperview && secondViewSuperview) {
    MAS_VIEW *firstViewSuperview = self;
    while (!closestCommonSuperview && firstViewSuperview) {
    if (secOndViewSuperview== firstViewSuperview) {
    closestCommOnSuperview= secondViewSuperview;
    }
    firstViewSuperview = firstViewSuperview.superview;
    }
    secOndViewSuperview= secondViewSuperview.superview;
    }
    return closestCommonSuperview;
    }
    xieguobihaha
        17
    xieguobihaha  
       2016-11-27 18:38:50 +08:00
    @nagato ![]( ) 我用你的方法代入上面那张图貌似有问题,假设 A 是 2 , B 是 9 ,你试一下。
    nagato
        18
    nagato  
    OP
       2016-11-27 18:44:47 +08:00 via iPad
    @xieguobihaha 你再仔细看看
    binux
        19
    binux  
       2016-11-27 18:55:10 +08:00   1
    @nagato 假如 A 是 3 , B 是 6
    itqls
        20
    itqls  
       2016-11-27 22:39:11 +08:00
    @binux hhh 打脸~
    Biscuits
        21
    Biscuits  
       2016-12-01 02:25:38 +08:00
    可以 hitTest 试试吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1468 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 16:44 PVG 00:44 LAX 09:44 JFK 12:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86