题目

源地址:

http://poj.org/problem?id=1002

理解

简单一看就是一道关于字典的题目,将ABC等字符转化为对应的数字,从而求出这个字符串所对应的电话号码。 然后就是我不机智的地方了。我求出的电话号码依然是使用char数组类型保存的,比较的时候使用了strcmp函数,为了降低复杂度,还使用了各种标记,最后就是一团乱麻。在点拨之后才发现,直接转化为int型,然后sort排序,轻松搞定。

#新技能get 以前就在困惑使用cout的时候如何控制它的输出形式,解题过程中,在cplusplus上面找到了一个库iomanip。通过setfillsetw函数的配合,解决了在数字之间插入一个-的问题。

代码

# include <iostream>
# include <algorithm>
# include <iomanip>

using namespace std;

int normal(char a)
{
    {
        if (a == 'A' || a == 'B' || a == 'C')
            return 2;
        if (a == 'D' || a == 'E' || a == 'F')
            return 3;
        if (a == 'G' || a == 'H' || a == 'I')
            return 4;
        if (a == 'J' || a == 'K' || a == 'L')
            return 5;
        if (a == 'M' || a == 'N' || a == 'O')
            return 6;
        if (a == 'P' || a == 'R' || a == 'S')
            return 7;
        if (a == 'T' || a == 'U' || a == 'V')
            return 8;
        if (a == 'W' || a == 'X' || a == 'Y')
            return 9;
    }
}

int time[10000000];
bool vist[10000000];
int out[100000];

int main()
{
    int n;
    while (cin >> n)
    {
        memset(time, 0, sizeof(time));
        memset(vist, 0, sizeof(vist));
        int positive = 0;
        bool flag = false;

        for (int i = 1; i <= n; i++)
        {
            int x = 0;
            char s[20];
            cin >> s;
            for (int j = 0; s[j] != '\0'; j++)
            {
                if (s[j] == '-' || s[j] == 'Q' || s[j] == 'Z')
                    continue;
                else if (s[j] <= '9')
                    x = x * 10 + s[j] - '0';
                else if (s[j] <= 'Z')
                    x = x * 10 + normal(s[j]);
            }
            time[x]++;

            if (!vist[x] && time[x] >= 2)
            {
                flag = true;
                vist[x] = true;
                out[positive++] = x;
            }
        }

        if (!flag)
            cout << "No duplicates." << endl;
        else
        {
            sort(out, out + positive);
            for (int i = 0; i < positive; i++)
            {
                cout << setfill('0') << setw(3) << out[i] / 10000;
                cout << '-';
                cout << setfill('0') << setw(4) << out[i] % 10000;
                cout << ' ' << time[ out[i] ] << endl;
            }
        }
    }
    return 0;
}

更新日志

  • 2014年07月03日 完成解题报告