UVA755 487--3279 题解
UVA755 487–3279题目描述Link: https://uva.onlinejudge.org/index.php?optioncom_onlinejudgeItemid8category9pageshow_problemproblem696PDF输入格式输出格式输入输出样例 #1输入 #11 12 4873279 ITS-EASY 888-4567 3-10-10-10 888-GLOP TUT-GLOP 967-11-11 310-GINO F101010 888-1200 -4-8-7-3-2-7-9- 487-3279输出 #1310-1010 2 487-3279 4 888-4567 3Solution题意本题单个 checkpoint 包含多组数据在每一组数据中…会先输入一个整数n nn此后会输入n nn个包含字母、数字和横线的字符串将这些字符串按照给定的对应法则转化为整数后输出重复的电话号码有哪些重复了多少次按照号码升序输出。如果没有重复输出No duplicate.。分析1. 原始输入转化为整数数值原始输入除了横线外包含 7 个数字或字母的字符。可以先定义一个初始为0 00的整数值。每读到一个有效的字符就将该数值乘以10 1010加上对应的数字。由此以来读取完7 77个有效字符后就能够得到一个最多7 77位的数值若不足7 77位输出需要补上前导0 00。参考代码intlenln.length(),val0;for(intj0;jlen-1;j1){if(ln[j]Aandln[j]Zorln[j]0andln[j]9){val*10;if(ln[j]0)val0;if(ln[j]1)val1;if(ln[j]Aln[j]C||ln[j]2)val2;if(ln[j]Dln[j]F||ln[j]3)val3;......if(ln[j]Wln[j]Y||ln[j]9)val9;}}cnt[val]1;2. 统计本题中所有的电话号码转化完毕后均为可能包含前导0 00的正好7 77位数字因此可以考虑直接使用“桶思想”构造一个长度为10 7 10^7107的整数数组来存储每个电话号码的出现频次如果有出现频次大于等于2 22的就按照对应的格式输出即可。3. 判断无解判断无解最通常的方法是循环开始前定义一个bool变量初始化为 0一旦循环过程中输出了符合题意的答案就置为 1。循环结束后如果这个变量仍然为 0 就输出无解。4. 注意事项大数组必须创建为全局数组若放在主函数内会导致段错误在第 1 条的条件下由于多组数据每组数据完毕后一定要用memset函数清空数组单个测试点多组数据相邻两组数据之间要输出一个空行最后一组数据完毕后不需要输出额外的空行因此需要判断当前处理完毕的数据是不是最后一组数据这个坑点不太容易注意到也是导致 Presentation Error 的罪魁祸首之一。代码#includebits/stdc.husingnamespacestd;intcnt[10000010],t,n;string ln;intmain(){cint;while(t){memset(cnt,0,sizeof(cnt));cinn;for(inti1;in;i1){cinln;intlenln.length(),val0;for(intj0;jlen-1;j1){if(ln[j]Aandln[j]Zorln[j]0andln[j]9){val*10;if(ln[j]0)val0;if(ln[j]1)val1;if(ln[j]Aln[j]C||ln[j]2)val2;if(ln[j]Dln[j]F||ln[j]3)val3;if(ln[j]Gln[j]I||ln[j]4)val4;if(ln[j]Jln[j]L||ln[j]5)val5;if(ln[j]Mln[j]O||ln[j]6)val6;if(ln[j]Pln[j]S||ln[j]7)val7;if(ln[j]Tln[j]V||ln[j]8)val8;if(ln[j]Wln[j]Y||ln[j]9)val9;}}cnt[val]1;}boolflag0;for(inti0;i9999999;i1)if(cnt[i]2){printf(%03d-%04d %d\n,i/10000,i%10000,cnt[i]);flag1;}if(flag0)coutNo duplicates.endl;if(t)coutendl;t-1;}}