昨天突发奇想,准备要去撩下妹,于是去问一个妹子要电话
但是令我震精的是,居然得到了介样的回答。
虽然我只是拿到一段乱序的号码,但是机智的我岂能就此罢休,毕竟我可是一只程序猿啊!!!我要培养自己对数据敏感度和处理能力啊!!!
妹纸说过,介是一个132开头的某市手机号,于是我立马百度了某市号码段,开头大致是以下这些不到一百个的7位数号码吧。。。看上去有点多啊。。但我并不方。
于是我就从网上随便下了一份某市号码段的文件开始着手设计介个计算妹子手机号的算法。
技术选型:标准console C++和STL。
开发环境:VS2013
实现思路:
//放置妹子给的乱序号码的容器
std::vector<char> ReorderNum
//放置所有候选7位数号段的容器链表
std::list<vector<char>> listCandidateLocalNum;
//放置经过筛选后都的小范围号段
//pair.first是手机号前7位的有序号码段
//pair.second是乱序的妹子后四位手机号
std::list<std::pair<std::vector<char>, std::string>> listFiltedNum;
其实从网上下载下来的号码文件挺人性化的,居然才只有一行,就是长下面这样
我只要一个gets就全读到内存了。。哈哈哈哈哈哈哈,此时的我还真的有点小开心啊,只要给字符串按七个字节七个字节的分割开来就好了。
char allNum[1024];
std::vector<char> tmpNum;
memset(allNum, 0, sizeof(allNum));
fgets(allNum, sizeof(allNum), fp);
fclose(fp);
for (int i = 0, j = 0; allNum[i] != '\0'; i++)
{
tmpNum.push_back(allNum[i]);
j++;
if (7 == j)
{
listCandidateLocalNum.push_back(tmpNum);
tmpNum.clear();
j = 0;
}
}
把介些东西都读到用链表串起来的容器里面后。只要拿这些容器节点里的字符一个个的跟乱序号码去比就好了,匹配到一个就从乱序字符串里清除一个,只要最有能有四个字符剩下的就绝对是妹子的乱序手机号后四位了。。。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,刚刚才开始觉得自己有点机智,问题又来了。
for (itCandidateNum = listCandidateLocalNum.begin();
itCandidateNum != listCandidateLocalNum.end(); itCandidateNum++)
{
std::vector<char> tmpNum = *itCandidateNum;
std::vector<char>::iterator it1;
std::string strReN(ReorderingNum.begin(),
ReorderingNum.end());
for (it1 = tmpNum.begin(); it1 != tmpNum.end(); it1++)
{
if (string::npos != strReN.find(*it1))
{
strReN.erase(strReN.find(*it1), 1);
}
else
{
break;
}
}
it1 == tmpNum.end()
? listFiltedNum.push_back(make_pair(tmpNum, strReN)) : NULL;
}
计算出来的结果居然是长这样的
他居然有三种可能结果,也就是说,前面七位也是有三种结果。。
然后我就不停的跟自己说,程序就这鸟样了,快去套妹子的话,哈哈哈哈哈哈哈哈哈哈哈。
感觉得要故弄玄虚一波,让妹子告诉我是哪一组才行啊。
于是皇天不负有心人,她还真告诉我是第三组。
不过其实也并没有什么卵用了,后面四位成了一个A44的排列组合问题,总共24种答案。除了暴力穷举,也再没有什么更好的解决办法了,而且如果穷举去找的话,估计要被人其他的23个人说我傻逼喷死。哈哈哈哈哈哈哈哈哈哈哈。
所以最后,我就投降了,如果下次投简历面试,HR让我给点代码给他们审阅,我就把这份计算妹子电话号码程序给他!然后跟他说,我虽不完美,但我一定会努力解决问题。哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
最后的最后,完整的代码贴出来,还望各位大神对不足之处指点一二。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
FILE* fp;
char* szNum = "11237122132";
std::vector<char> ReorderingNum(szNum, szNum + strlen(szNum));
std::list<vector<char>> listCandidateLocalNum;
std::list<vector<char>>::iterator itCandidateNum;
std::list<std::pair<std::vector<char>, std::string>> listFiltedNum;
fp = fopen("C:\\Users\\shakespear\\Desktop\\CandidateTL.txt", "r");
if (NULL == fp)
{
printf("open file failed...\n");
return 0;
}
else //将75个候选号段分离
{
char allNum[1024];
std::vector<char> tmpNum;
memset(allNum, 0, sizeof(allNum));
fgets(allNum, sizeof(allNum), fp);
fclose(fp);
for (int i = 0, j = 0; allNum[i] != '\0'; i++)
{
tmpNum.push_back(allNum[i]);
j++;
if (7 == j)
{
listCandidateLocalNum.push_back(tmpNum);
tmpNum.clear();
j = 0;
}
}
}
//计算前7位
for (itCandidateNum = listCandidateLocalNum.begin();
itCandidateNum != listCandidateLocalNum.end(); itCandidateNum++)
{
std::vector<char> tmpNum = *itCandidateNum;
std::vector<char>::iterator it1;
std::string strReN(ReorderingNum.begin(), ReorderingNum.end());
for (it1 = tmpNum.begin(); it1 != tmpNum.end(); it1++)
{
if (string::npos != strReN.find(*it1))
{
strReN.erase(strReN.find(*it1), 1);
}
else
{
break;
}
}
it1 == tmpNum.end()
? listFiltedNum.push_back(make_pair(tmpNum, strReN)) : NULL;
}
return 0;
}
其实一直以来,我都很羡慕CSDM和MSDN的大神,能把技术贴写得那么,其实这也是我的CSDN第一篇博文,当然我的目的纯粹只是想让各位大神帮忙指正缺点,原谅我硬生生写成了一个段子,让大家读的这么辛苦,,哈哈哈。