算法:C++实现电话号码分身
2017-08-09 10:45
274 查看
题目:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替 (”ZERO”, “ONE”, “TWO”, “THREE”, “FOUR”, “FIVE”, “SIX”, “SEVEN”, “EIGHT”, “NINE”), 然后随机打乱这些字母,所生成的字符串即为电话号码对应的分身。
思路:通过这些单词我们会发现有些字母只出现在特定的单词中,例如“Z”只出现在“ZERO”这个单词中,那么输入的字符串中包含的“Z”的数目实际上就转换后数字“0”的数目,类似的其他数字我们都可以通过找到专属字符或是通过已确定的数字准确的推算出来,然后我们就可以根据这些个特定的字符来推算对应的数字。
牛客上高人做法:链接
土著民做法(土了自然好理解)
思路:通过这些单词我们会发现有些字母只出现在特定的单词中,例如“Z”只出现在“ZERO”这个单词中,那么输入的字符串中包含的“Z”的数目实际上就转换后数字“0”的数目,类似的其他数字我们都可以通过找到专属字符或是通过已确定的数字准确的推算出来,然后我们就可以根据这些个特定的字符来推算对应的数字。
牛客上高人做法:链接
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <map> void operMap(std::map<char, int> &index, std::string str, int num) { for (int i = 0; i < str.size(); i++) { index[str[i]] -= num; } } int main() { using namespace std; int t; cin >> t; while (t--) { string str; cin >> str; map<char, int> index; vector<int> arr(10, 0); for (int i = 0; i < str.size(); i++) { map<char, int>::iterator itor = index.find(str[i]); if (itor == index.end()) { index[str[i]] = 1; } else { index[str[i]]++; } } arr[2] = index['Z']; operMap(index, "ZERO", arr[2]); arr[4] = index['W']; operMap(index, "TWO", arr[4]); arr[6] = index['U']; operMap(index, "FOUR", arr[6]); arr[8] = index['X']; operMap(index, "SIX", arr[8]); arr[0] = index['G']; operMap(index, "EIGHT", arr[0]); arr[3] = index['O']; operMap(index, "ONE", arr[3]); arr[5] = index['R']; operMap(index, "THREE", arr[5]); arr[7] = index['F']; operMap(index, "FIVE", arr[7]); arr[9] = index['V']; operMap(index, "SEVEN", arr[9]); arr[1] = index['I']; operMap(index, "NINE", arr[1]); for (int i = 0; i < 10; i++) { for (int j = 0; j < arr[i]; j++) { cout << i; } } cout << endl; } return 0; }
土著民做法(土了自然好理解)
#include<iostream> #include<vector> #include<algorithm> int c2i(char c){ switch(c){ case 'Z':return 0;break; case 'W':return 2;break; case 'U':return 4;break; case 'X':return 6;break; case 'G':return 8;break; case 'H':return 3;break; case 'F':return 5;break; case 'S':return 7;break; case 'O':return 1;break; default:return 0; } } void transfer(std:: 4000 vector<int>& vec){ for(int i=0;i<vec.size();++i){ vec[i]=(vec[i]+2)%10; } } void countNum(std::vector<int>&vec_c,std::vector<int>&vec_i,int & count){ while(count>0){ if(vec_c['Z'-'A']){ vec_i.push_back(c2i('Z')); vec_c['Z'-'A']--; vec_c['E'-'A']--; vec_c['R'-'A']--; vec_c['O'-'A']--; count-=4; } else if(vec_c['W'-'A']){ vec_i.push_back(c2i('W')); vec_c['W'-'A']--; vec_c['T'-'A']--; vec_c['O'-'A']--; count-=3; } else if(vec_c['U'-'A']){ vec_i.push_back(c2i('U')); vec_c['F'-'A']--; vec_c['O'-'A']--; vec_c['U'-'A']--; vec_c['R'-'A']--; count-=4; } else if(vec_c['X'-'A']){ vec_i.push_back(c2i('X')); vec_c['X'-'A']--; vec_c['S'-'A']--; vec_c['I'-'A']--; count-=3; } else if(vec_c['G'-'A']){ vec_i.push_back(c2i('G')); vec_c['G'-'A']--; vec_c['E'-'A']--; vec_c['I'-'A']--; vec_c['H'-'A']--; vec_c['T'-'A']--; count-=5; } else if(vec_c['H'-'A']){ vec_i.push_back(c2i('H')); vec_c['T'-'A']--; vec_c['H'-'A']--; vec_c['R'-'A']--; vec_c['E'-'A']--; vec_c['E'-'A']--; count-=5; } else if(vec_c['F'-'A']){ vec_i.push_back(c2i('F')); vec_c['F'-'A']--; vec_c['I'-'A']--; vec_c['V'-'A']--; vec_c['E'-'A']--; count-=4; } else if(vec_c['S'-'A']){ vec_i.push_back(c2i('S')); vec_c['S'-'A']--; vec_c['E'-'A']--; vec_c['V'-'A']--; vec_c['E'-'A']--; vec_c['N'-'A']--; count-=5; } else if(vec_c['O'-'A']){ vec_i.push_back(c2i('O')); vec_c['O'-'A']--; vec_c['N'-'A']--; vec_c['E'-'A']--; count-=3; } } } int main(){ int num; std::cin>>num; while(num--){ std::string temp; std::vector<int> vec_c(26,0); std::vector<int> vec_i; int count=0; std::cin>>temp; for(int i=0;i<temp.length();++i){ vec_c[temp[i]-'A']++; count++; } //计数 countNum(vec_c,vec_i,count); transfer(vec_i); sort(vec_i.begin(),vec_i.end()); for(auto c:vec_i){ std::cout<<c; } std::cout<<std::endl; //输出 } return 0; }
相关文章推荐
- 算法复习-归并、快排、插入、堆-c++实现
- 算法复习-红黑树-c++实现
- 图的深度优先搜索和广度优先搜索算法、最小生成树两种算法 --C++实现
- 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
- 算法学习-桶排序(Bucket Sort) C++实现
- 海量数据处理系列----C++中Bitmap算法的实现
- 【算法导论】二叉查找树的操作C++实现
- 完整的C++实现算法导论十三章红黑树以及十四章中的顺序统计树
- C/C++:各种基本算法实现小结(二)—— 堆 栈
- C++模板实现二叉树(五 树的平衡之dsw算法)
- C++模板数组实现有序数组的排列合并算法
- 字符串匹配算法的C/C++语言实现(一)
- 【算法和数据结构】排序(四)归并排序和快速排序(C++实现)
- 算法代码实现之插入排序,C/C++实现
- c/c++算法之正确实现二分查找
- 【算法和数据结构】排序(三)插入排序(C++实现)
- 统计一个Byte中1的个数,算法尽可能高性能——C++实现
- C++实现算法导论十五章动态规划之钢条分割问题
- 单词字典中对兄弟单词查找算法(C++实现)
- C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen