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

2014 年 3 月 5 日
 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 以顺时针出现了两次。

我能想到的只能是遍历了...大家有什么好的思路么?
4836 次点击
所在节点    问与答
22 条回复
cxe2v
2014 年 3 月 5 日
不在一行的顺时针也算么?
cxe2v
2014 年 3 月 5 日
@cxe2v 额,刚理解错了
nigelvon
2014 年 3 月 5 日
遍历复杂度应该也不高哇。
ETiV
2014 年 3 月 5 日
* * * *
1 2 * *
3 4 * *
* * * *

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

1 2
4 3

2 3
1 4

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

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

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

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

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

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

© 2021 V2EX