chenggiant
V2EX  ›  问与答

面试时的一道算法题,大家来挑战下吧

  •  
  •   chenggiant · Mar 5, 2014 · 5402 views
    This topic created in 4630 days ago, the information mentioned may be changed or developed.
    给定一个文件,里面有10000个数字,数字只从{1,2,3,4}里面选取。这些数字排成100*100的网格。找出里面序列 1234 以顺时针出现的次数(闭环)。

    例子:
    3 3 1 2
    1 2 3 4
    4 3 2 3
    1 1 1 4

    比如这个例子里面,1234 以顺时针出现了两次。

    我能想到的只能是遍历了...大家有什么好的思路么?
    Supplement 1  ·  Mar 6, 2014
    谢谢大家的回复呀。

    决定看下Rabin–Karp algorithm,感觉可以用在这种情况。
    22 replies  •  1970-01-01 08:00:00 +08:00
    cxe2v
    cxe2v
    Mar 5, 2014
    1
    不在一行的顺时针也算么?
    cxe2v
    cxe2v
    Mar 5, 2014
    2
    @cxe2v 额,刚理解错了
    nigelvon
    nigelvon
    Mar 5, 2014
    3
    遍历复杂度应该也不高哇。
    ETiV
    ETiV
    Mar 5, 2014
    4
    * * * *
    1 2 * *
    3 4 * *
    * * * *

    我肉眼只看到了这一个呀, 那个呢?
    alsotang
    alsotang
    Mar 5, 2014
    5
    遍历的复杂度是 O(n)的吧,还能少?
    lsylsy2
    lsylsy2
    Mar 5, 2014
    6
    100*100……遍历也很快吧?
    bleutee
    bleutee
    Mar 5, 2014
    7
    @ETiV
    * * * *
    * * * *
    * * 2 3
    * * 1 4
    chenggiant
    chenggiant
    OP
    Mar 5, 2014
    8
    @ETiV

    1 2
    4 3
    和
    2 3
    1 4

    额,我可能还是没说清楚呀。
    a591826944
    a591826944
    Mar 5, 2014❤️1
    9
    从 行里面 遍历相邻的两个数字 相加 等于 3/5/7 如果是 记位置,看下一行这个位置的两个数字 是不是能组成符合规则的,如果不是 下一行的这个位置 就不用看了 肯定不行
    这样就不用便利全部的矩阵了
    justfindu
    justfindu
    Mar 5, 2014
    10
    @a591826944 这样下一行的这个位置也有可能是下下行的符合要求的~ 还是要遍历的啊
    forestkeeper
    forestkeeper
    Mar 5, 2014❤️1
    11
    @alsotang 能的,和kmp算法差不多的方案来剪枝,可以跳着遍历
    binux
    binux
    Mar 5, 2014❤️1
    12
    顺时针,还要闭环,总共就4种可能,这太简单了吧。。
    读一行,缓存下一行,如果第一行相邻两个数字满足,判断下一行是否一样满足。O(n)而已

    要不我们来改一下,只要4个数字相连(4/8个方向),能组成1234即可,有多少种。
    marklrh
    marklrh
    Mar 5, 2014
    13
    @a591826944 只看相加的值可以么?有可能是逆时针的啊
    shibo501c
    shibo501c
    Mar 5, 2014
    14
    感觉可以预处理一下,数组存起来,可以计算四个相邻位置的和,如果是10,就存起来,然后再统一看下是不是顺序的,这样会优化一些吧
    Sdhjt
    Sdhjt
    Mar 5, 2014
    15
    还是遍历吧,反正复杂度不高
    hongdengdao
    hongdengdao
    Mar 5, 2014
    16
    开始只要找通过找到1的上边或者右边为2的位置,在这些为2的位置对应的顺时针位置。。。直到找到4
    hongdengdao
    hongdengdao
    Mar 5, 2014❤️1
    17
    总之只要先找1即可
    acros
    acros
    Mar 5, 2014
    18
    最好的情况一时想不到,因为这个要求2x2的,肯定能跳着好些···
    laoyang945
    laoyang945
    Mar 6, 2014
    19
    我遇到一个相同的题目,不过是在10000*10000的矩阵里面找一个3*3 的模式出现的次数,该模式正中央那格无需匹配
    chenggiant
    chenggiant
    OP
    Mar 6, 2014
    20
    @laoyang945 感觉你这个更复杂啊。有想到好的方法么?
    RobinFai
    RobinFai
    Mar 6, 2014
    21
    码渣只能写成这样了.......

    https://gist.github.com/robinfai/9383871
    momou
    momou
    Mar 6, 2014
    22
    刚学JS,试着做了下
    https://gist.github.com/9387095
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1109 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 121ms · UTC 16:58 · PVG 00:58 · LAX 08:58 · JFK 11:58
    ♥ Do have faith in what you're doing.