看起来像一个很简单的range set
EXE我就懒得弄了,也不知道你的电脑是什么系统。
源码如下:
#include <algorithm>
#include <functional>
#include <iostream>
#include <set>
// A set of disjoint ranges [a, b)
class RangeSet {
public:
using Range = std::pair<long, long>;
bool Overlaps(const Range& range) const {
auto right = std::lower_bound(ranges_.begin(), ranges_.end(), range, std::less<Range>());
if (right != ranges_.end() && right->first < range.second) {
return true;
}
auto left = std::lower_bound(ranges_.rbegin(), ranges_.rend(), range, std::greater<Range>());
if (left != ranges_.rend() && left->second > range.first) {
return true;
}
return false;
}
bool Add(const Range& range) {
if (Overlaps(range)) {
return false;
}
ranges_.insert(range);
return true;
}
private:
std::set<Range> ranges_;
};
int main() {
RangeSet set;
std::cout << "[1, 5) " << set.Add({1, 5}) << "\n";
std::cout << "[2, 6) " << set.Add({2, 6}) << "\n";
std::cout << "[130'0000'0000, 140'0000'0000) " << set.Add({130'0000'0000, 140'0000'0000}) << "\n";
std::cout << "[139'0000'0000, 139'0000'0001) " << set.Add({139'0000'0000, 139'0000'0001}) << "\n";
std::cout << "[11, 110) " << set.Add({11, 110}) << "\n";
return 0;
}
【 在 speedboy2998 (极品飞车) 的大作中提到: 】
: 标 题: 谁给我写一个高效算法,可以支付宝或者微信转账
: 发信站: 水木社区 (Wed Mar 4 17:28:08 2020), 站内
:
: 一个检测电话号码重复冲突的算法。
:
: 一个输入框,允许用如下形式输入电话号码:
: 13877692008
: 13801000000-13808001000
: 13*
:
: 输入的号码可能是全世界任何国家的手机号码,固定电话,
: 需要检测新输入的号码或者号码范围是否和之前输入的号码,号码范围重复。
:
: 比如之前如果输入了13*
: 那么后续输入 100-130就是冲突;输入136*也是冲突; 输入13566207876也是冲突。
:
: 如果之前输入了 135-8978, 后续输入 500 就是冲突。
: 如果之前输入了 13800000000-138999999999 , 后续输入 8* 不冲突。
:
: 需要高效和正确地实现,可以私信报价。完成后,可以先把EXE上传到这里或者发给我,验证通过后付款,然后给代码。
:
:
: --
: ※ 修改:·speedboy2998 于 Mar 4 17:28:54 2020 修改本文·[FROM: 47.56.124.*]
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 47.56.124.*]
--
修改:speedboy2998 FROM 47.56.124.*
FROM 76.126.252.*