- 主题:Re: 谁给我写一个高效算法,可以支付宝或者微信转账
电话号码长度固定,又有区间又有通配符,用字符串是不是方便一点?
直接比大小就行吧
【 在 fanci 的大作中提到: 】
: 说个思路你自己实现一下吧。其实二楼已经说得八九不离十了。如果没有前缀通配,那这个问题就是整数区间求并求交,二分法不难。而对于前缀通配,比如13*,而已转换成以下区间的并:13, 130-139, 1300-1399, 13000-13999, 等等,其个数是电话号码的长度上界L。
--
FROM 152.78.0.*
应该固定啊,楼主的需求明确了是电话号码,那长度就是固定的11位
如果有国家代码,按照每一个国家一组来处理。用国家代码做key,存在一个map里面。分离国家码后,把后面的传入value做判断。就是做一个
map<int, PhoneNumValidate>
先弄key
1。先判断-,有两个或者以+开头肯定是带国家码的,转成int做key,截取后面的备用的
2。如果只有一个-,判断-前面的长度,小于5且没有*,前面就是国家码,转成int做key,截取后面的备用
然后弄号码验证,这个内部也用map保存电话号码,自己做个pair来保存区间上下界,用一个vector保存所有区间
1。有*就是通配,把后面补齐做range验证,例如135*,那你就做个range,只记录上下界13500000000,和13599999999.
2。有-就是区间,还是记录上下界,跟1一样
3。如果是电话号码,去map里面查重,有就通知退出,没有就循环所有区间,用上下界跟当前号码判断大小,在区间就通知退出。区间判断完了,说明不在,就加入map保存
4。如果是区间,先去查map单个号码,然后和其它保存的区间比较大小,都不冲突就加入区间vector
【 在 here080 的大作中提到: 】
: 电话号码长度不固定啊,你要不同意我就报警了。
:
--
FROM 152.78.1.*
为啥报警?求科普
【 在 here080 的大作中提到: 】
: 报警了!
:
--
FROM 152.78.1.*
楼主这个需求里面没有提到特殊号码,如果有,就全部写了查表,因为特殊的那么几个
【 在 galaxy123 的大作中提到: 】
: 电话号码长度不固定,如报警电话 110
:
: :
: ...................
--
FROM 82.19.154.*
我上面说了要分国家保存判断啊,每个国家自己判断自己的,一个国家能有多少个特殊号码?多了也就不特殊了
【 在 here080 的大作中提到: 】
: 你没有考虑不同国家的情况。
:
--
FROM 86.24.25.*