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

2014-03-05 14:04:34 +08:00
 chenggiant
给定一个文件,里面有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 以顺时针出现了两次。

我能想到的只能是遍历了...大家有什么好的思路么?
4120 次点击
所在节点    问与答
22 条回复
cxe2v
2014-03-05 14:12:42 +08:00
不在一行的顺时针也算么?
cxe2v
2014-03-05 14:13:27 +08:00
@cxe2v 额,刚理解错了
nigelvon
2014-03-05 14:16:52 +08:00
遍历复杂度应该也不高哇。
ETiV
2014-03-05 14:17:56 +08:00
* * * *
1 2 * *
3 4 * *
* * * *

我肉眼只看到了这一个呀, 那个呢?
alsotang
2014-03-05 14:19:28 +08:00
遍历的复杂度是 O(n)的吧,还能少?
lsylsy2
2014-03-05 14:19:41 +08:00
100*100……遍历也很快吧?
bleutee
2014-03-05 14:21:06 +08:00
@ETiV
* * * *
* * * *
* * 2 3
* * 1 4
chenggiant
2014-03-05 14:21:13 +08:00
@ETiV

1 2
4 3

2 3
1 4

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/102960

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX