1
tabris17 2013-11-26 09:54:46 +08:00
算法你不是都描述出来么
|
2
megaforce 2013-11-26 09:56:19 +08:00 1
看这个是否可以达到你的要求:
http://www.itpub.net/thread-1801997-2-1.html |
3
Mutoo 2013-11-26 10:11:03 +08:00 1
第一种情况用正则很容易构造 \d{3}
第二个情况实际上也可以构造正则,因为数量太少了 (0123)|(1234)|(2345)|(3456)|(4567)|(5678)|(6789)|(7890) |
4
shunai OP |
7
tabris17 2013-11-26 11:01:48 +08:00 1
@shunai 死做呗,查找字符串内是否包含子串:
111,1111,11111,…… 222,2222,22222,…… …… 999,9999,99999,…… 000,0000,00000,…… 123、1234、12345、…… 234、2345、23456、…… …… 678,6789 789 2w条记录也很快就出来了 |
8
seeker 2013-11-26 13:23:18 +08:00 1
以前遇到过个银行卡号的正则,主要靠枚举,4000个字符不够存了,后来还增大数据库字段的长度...
|
9
alexrezit 2013-11-26 13:31:03 +08:00 1
你可以自己写一个算法来给每个号码的 "亮" 度打分然后排序...
(虽然我觉得毫无任何科学依据地把一些数字排列说成 "亮" 很脑残...) |
14
luikore 2013-11-26 17:02:29 +08:00
从靓到丑排列打印(ruby)
puts numbers.sort_by{|n| a = (n[/(\d)\1+/] || '').size b = n.count /01|12|23|34|45|56|67|78|89/ [a, b].max } |
15
luikore 2013-11-26 17:06:09 +08:00
呃, 上一帖加个 .reverse, 意思明白就好
|
16
wangyongbo 2013-11-26 17:08:20 +08:00
规则很多,用个 有限状态 自动机 ? 停止的时候,就是符合某个规则的靓号
|
17
nealnote 2013-11-26 17:37:46 +08:00 1
大家都在说正则。
我换个思路说,不是正则, 用 charcode 0: 48 1: 49 计算2个相邻字的code差值,相差不大于1的,不是相等就是连号。 用这个方法就不限于数字,字母也可以用。 |
18
fanzeyi 2013-11-26 18:34:47 +08:00
个人倾向于给每个手机好评定出一个分数。
手机号码每一位依次往后扫,比如这一位是 6 ,就这个号码加 2 分,然后这一位的前面有 n 个 6,那么就加 2 * n 分,等等这些规则,最后统计每个号码的分数,结果就有了。 |
19
fanzeyi 2013-11-26 18:35:14 +08:00
啊,第一句应该是「手机号」,不是「手机好」,笔误..
|
20
meta 2013-11-26 19:11:36 +08:00
好像没啥现成的办法,只能用原始的方法,把这些号码拆成单个数字,扔到一颗树里面,从根节点开始遍历。
|
23
kfqb536 2013-11-26 21:02:33 +08:00
mark
|
24
coldear 2013-11-28 04:49:11 +08:00
这个问题其实就是从一个字符串中同时找到最长递增序列和最长重复序列。
大O是 m(字符串个数)*n(单个字符串长度)。 就每个字符串扫一遍。 |