A - 487-3279
Description
The standard form of a telephone number is seven decimal digits with a hyphen between the third and fourth digits (e.g. 888-1200). The keypad of a phone supplies the mapping of letters to numbers, as follows:
A, B, and C map to 2 D, E, and F map to 3 G, H, and I map to 4 J, K, and L map to 5 M, N, and O map to 6 P, R, and S map to 7 T, U, and V map to 8 W, X, and Y map to 9
There is no mapping for Q or Z. Hyphens are not dialed, and can be added and removed as necessary. The standard form of TUT-GLOP is 888-4567, the standard form of 310-GINO is 310-4466, and the standard form of 3-10-10-10 is 310-1010.
Two telephone numbers are equivalent if they have the same standard form. (They dial the same number.)
Your company is compiling a directory of telephone numbers from local businesses. As part of the quality control process you want to check that no two (or more) businesses in the directory have the same telephone number.
Input
Output
No duplicates.
Sample Input
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
Sample Output
310-1010 2
487-3279 4
888-4567 3 以下为超时代码,太繁琐了!!!
#include <iostream>
#include <string>
using namespace std;
int f(char s[][],int x[],int y[],int n)
{
int q=,t,p,i,k,j;
for(i=;i<n-;i++){
if(s[i][]=='*')continue;
y[q]=;
for(k=i+;k<n;k++){
bool flag=true;
for(j=;j<;j++){
if(s[i][j]!=s[k][j]){
flag=false;
break;
}
}
if(flag==true){
s[k][]='*';
y[q]++;
}
}
if(y[q]>){
x[q]=i;
q++;
}
}
for(i=;i<q;i++){
for(j=;j<q-i-;j++)
for(p=;p<;p++){
if(s[x[j+]][p]>s[x[j]][p])break;
if(s[x[j+]][p]<s[x[j]][p]){
t=x[j];
x[j]=x[j+];
x[j+]=t;
t=y[j];
y[j]=y[j+];
y[j+]=t;
break;
}
}
}
return q;
}
int main()
{
int n,i,j,k=,x[],y[],q;
char s[][];
cin>>n;
while(k<n){
string str;
int a;
cin>>str;
a=str.length();
for(i=;i<a;i++){
if(str[i]=='-'){
for(j=i;j<a-;j++)str[j]=str[j+];
}
if(str[i]=='A'||str[i]=='B'||str[i]=='C')str[i]='';
if(str[i]=='D'||str[i]=='E'||str[i]=='F')str[i]='';
if(str[i]=='G'||str[i]=='H'||str[i]=='I')str[i]='';
if(str[i]=='J'||str[i]=='K'||str[i]=='L')str[i]='';
if(str[i]=='M'||str[i]=='N'||str[i]=='O')str[i]='';
if(str[i]=='P'||str[i]=='R'||str[i]=='S')str[i]='';
if(str[i]=='T'||str[i]=='U'||str[i]=='V')str[i]='';
if(str[i]=='W'||str[i]=='X'||str[i]=='Y')str[i]='';
if(i==){
str[i]='\0';
break;
}
}
for(i=;i<;i++)s[k][i]=str[i];
k++;
}
q=f(s,x,y,n);
for(i=;i<q;i++){
for(j=;j<;j++)cout<<s[x[i]][j];
cout<<'-';
for(j=;j<;j++)cout<<s[x[i]][j];
cout<<" "<<y[i]<<endl;
}
//system("pause");
return ;
}
不认真读题,n最大值为100000,上面定义s[100]!!!
修改几小时后!!
#include <iostream>
#include <string>
#include<stdlib.h>
using namespace std;
int temp[];
int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int change(string str)
{
int a,b;
a=str.length();
for(int i=;i<a;i++){
if(str[i]=='-'){
for(int j=i;j<a-;j++)str[j]=str[j+];
}
switch(str[i]){
case 'A':
case 'B':
case 'C':str[i]='';break;
case 'D':
case 'E':
case 'F':str[i]='';break;
case 'G':
case 'H':
case 'I':str[i]='';break;
case 'J':
case 'K':
case 'L':str[i]='';break;
case 'M':
case 'N':
case 'O':str[i]='';break;
case 'P':
case 'R':
case 'S':str[i]='';break;
case 'T':
case 'U':
case 'V':str[i]='';break;
case 'W':
case 'X':
case 'Y':str[i]='';break;
}
if(i==){
str[i]='\0';
break;
}
}
b=(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'')*+(str[]-'');
return b;
}
int main()
{
int n,k=,a=,b=;
bool flag=false;
cin>>n;
while(k<n){
string str;
cin>>str;
temp[k]=change(str);
k++;
}
qsort(temp, n, sizeof(int),comp);
for(int i=;i<n;++i){
if(i+<n&&temp[a]==temp[i+])b++;
else{
if(b){
flag=true;
printf("%03d-%04d %d\n", temp[a]/, temp[a]%, b+);
b=;
}
a=i+;
}
}
if(!flag) printf("No duplicates. \n");
// system("pause");
return ;
}
然后是WA!!!!!快被自己蠢死了!
对比了一下正确代码与自己代码发现,我的代码是对输入字符串中存在7个数字或大写字母,超过7个,之后的数字或大写字母不计算到电话号码中。而正确的代码将所有数字或大写字母都计算在内,因此
在我的代码中 111111111和1111111111111111111是相同的电话号码
而正确代码中,两者是不同的!!!
这就是题目的缺陷,题目提到 输入的字符串中只有7个,但测试时必然有多于七个的字符串,才导致我的代码的结果错误。至少我研究了很久,是这样想的。
此题要注意到字符串与数字的转换,这样才可以运用快速排序,避免程序超时
然后正确代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int telenum[];
int comp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int main()
{ int i, j, n, cnt, len, flag, low, sum;
char temp[];
char alphalist[] = "";
scanf("%d", &n);
for(i=; i<n; ++i)
{
scanf("%s", temp);
len = strlen(temp);
sum = ;
for(j= ; j<len; ++j)
{
if('' <= temp[j] && '' >= temp[j])
sum = sum* + (temp[j] - '');
else if('A'<= temp[j] && 'Z' >= temp[j])
sum = sum* + (alphalist[temp[j]-'A']-'');
}
telenum[i] = sum;
}
qsort(telenum, n, sizeof(int),comp);
low = cnt = flag = ;
for(i=; i<n; ++i)
{
if(i+ < n && telenum[low] == telenum[i+])
cnt++;
else
{
if(cnt)
{
flag = ;
printf("%03d-%04d %d\n", telenum[low]/, telenum[low]%, cnt+);
cnt = ;
}
low = i+;
}
}
if(!flag) printf("No duplicates.\n");
//system("pause");
return ;
}
A - 487-3279的更多相关文章
- 【枚举】POJ 3279
直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...
- CODEVS 3279 奶牛的健美操
3279 奶牛健美操 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description Farmer John为了保持奶牛们的 ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
- POJ 3279 - Fliptile - [状压+暴力枚举]
题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...
- POJ - 3279 Fliptile (枚举)
http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- poj 3279 Fliptile(二进制)
http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...
- POJ 3279 Filptile dfs
题目链接:http://poj.org/problem?id=3279 大意:给出一块n*m的棋盘.里面放满了棋子.有1和0两种状态.给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置 ...
随机推荐
- VS 2003 无法打开Web项目 文件路径与URL不符 这两者需要映射到相同的服务器位置
解决方法: 将C:\Documents and Settings\Administrator\VSWebCache下面的文件全部删除
- iOS-OC-基础-NSPredicate常用方法
NSpredicate 常用方法 // 谓词的条件查询 > .< .==.!= NSPredicate *predicate1 = [NSPredicate predicateWithFo ...
- UIView的一些常用属性和方法
UIView的一些常用属性和方法 1. UIView的属性 UIView继承自UIResponder,拥有touches方法. - (instancetype)initWithFrame:(CGRec ...
- jquery动态删除、复制、包裹DOM节点
1.remove()方法 移除满足条件的元素 <html> <head> <meta http-equiv="Content-Type" conten ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- Jquery网页选项卡应用
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- IE 与 FireFox 的 event 详解 (转)
原文链接 FF的FIREBUG,不仅能测试JS还能检查CSS错误,是一般常用的. 但它主要检查FF方面的错误,对IE就无能为力了. 要测试IE,就用ieTester,它可以测试IE几乎所有版本(1.0 ...
- 远程复制 scp命令
定义 本机为A,用户名为usera,登录远程主机B的为userb,IP为remote_ip 1. 从B 拷贝文件到A机器 用下面的命令 scp userb@remote_ip:remote_path ...
- php读取和保存base64编码的图片内容
<?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = './429 ...
- Oracle Trunc
http://www.cnblogs.com/xiaoyudz/archive/2011/03/18/1988467.html