Nenu算法复习第四章

目录

1122: 4101 统计字符数

1123: 4102 气球升起来

1124: 4103 All in All

1125: 4104 Soundex编码

1126: 4111 浮点数格式

1127: 4112 487-3279

1128: 4113 粗心的打字员

1129: 4114 单词逆序


1122: 4101 统计字符数

题目描述

判断一个由a~z这26个字符组成的字符串中哪个字符出现的次数最多。

输入

第1行是测试数据的组数n,每组测试数据占1行,是一个由a-z这26个字符组成的字符串,每组测试数据之间有一个空行,每行数据不超过1000个字符且非空。

输出

n行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中间是一个空格。
如果有多个字符出现的次数相同且最多,那么输出ASCII码最小的那一个字符。

样例输入 复制

2
abbccc

adfadffasdf

样例输出 复制

c 3
f 4
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        int a[10000]={0};
        for(int i = 0;i<s.size();i++)
        a[s[i]-'a']++;
        int max = 1;
        for(int i = 0;i<26;i++)
        {
            if(a[i]>max)
            max=a[i];
        }
        for(int i = 0;i<26;i++)
        {
            if(a[i]==max)
            {
                printf("%c %d\n",i+'a',a[i]);
                break;
            }
        }
    }
}

1123: 4102 气球升起来

题目描述

又到一年竞赛时,每当看到气球升起来,是多么令人兴奋呀。告诉你一个秘密,裁判总是热衷于猜哪题是最流行的题。比赛结束后,只要统计一下所有的气球颜色就能得到答案。
今年,他们决定把这个工作留给你来完成。

输入

输入包括多组测试样例,每个测试数据都是以数字N开始 (0 < N <= 1000) ,它标识分发的气球总数。接下来的N行就是不同颜色的气球,气球颜色是一个不超过15个字符的字符串。
当N=0时表示输入结束。

输出

对于每组数据,输出最流行的问题对应的颜色。这里保证每个测试数据只会有一个答案。

样例输入 复制

5
green
red
blue
red
red
3
pink
orange
pink
0

样例输出 复制

red
pink

 

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        break;
        vector<string> s;
        int count[10000]={0};
        int len = 0;
        while(n--)
        {
            string tem;
            cin>>tem;
            s.push_back(tem);
        }
        sort(s.begin(),s.end());
        for(int i = 0;i<s.size();i++)
        {
            if(s[i]!=s[i+1])
            {
                count[len]++;
                len++;
            }
            else
            {
                count[len]++;
            }
        }
        unique(s.begin(),s.end());
        int index = 0;int max = 0;
        for(int i = 0;i<len;i++)
        {
            if(count[i]>max)
            {
                index = i;
                max = count[i];
            }
        }
        cout<<s[index]<<endl;
    }
}

1124: 4103 All in All

题目描述

给定两个字符串s和t,判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。

输入

输入文件包括多组测试数据,每组测试数据占一行,包括两个由ASCII码组成的字符串s和t,它们的长度都不超过100000。

输出

对于每个测试数据输出一行,如果s是t的子序列,则输出“Yes”,否则输出“No”。

样例输入 复制

sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter

样例输出 复制

Yes
No
Yes
No
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    string s;string t;
    while(cin>>s>>t)
    {
        string res;
        int n = 0;
        for(int i = 0;i<s.size();i++)
        {
            for(int j = n;j<t.size();j++)
            {
                if(s[i]==t[j])
                {
                    res+=t[j];
                    n = j;
                    break;
                }
            }
        }
        if(res==s)
        cout<<"Yes"<<endl;
        else
        cout<<"No"<<endl;
    }
    return 0;
}

1125: 4104 Soundex编码

题目描述

Soundex编码是根据单词的拼写和发音相似性来对单词进行分组,例如,“can”与“khawn”, “con”与“gone”在Soundex编码下是相同的。
Soundex编码方法将每个单词转换成一串数字,每个数字代表一个字母。具体如下:
1 表示B、F、P或V;
2 表示C、G、J、K、Q、S、X或Z;
3 表示D或T;
4 表示L;
5 表示M或N;
6 表示R。
字母A,E,I,0,U,H,W和Y在Soundex中不用编码的,可以直接忽略。相邻的并且具有相同编码值的字母只用一个对应的数字表示。具有相同Soundex编码值的单词被认为是相同的单词。

输入

输入文件中的每行为一个单词,全部大写,不超过20个字母。

输出

对输入文件中的每个单词,输出该单词的Soundex编码,占一行。

样例输入 复制

KHAWN
PFISTER
BOBBY

样例输出 复制

25
1236
11
#include<iostream>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        string res;
        for(int i = 0;i<s.size();i++)
        {
            if(s[i]=='B'||s[i]=='F'||s[i]=='P'||s[i]=='V')
            res+='1';
            else if(s[i]=='C'||s[i]=='G'||s[i]=='J'||s[i]=='K'||s[i]=='Q'||s[i]=='S'||s[i]=='X'||s[i]=='Z')
            res+='2';
            else if(s[i]=='D'||s[i]=='T')
            res+='3';
            else if(s[i]=='L')
            res+='4';
            else if(s[i]=='M'||s[i]=='N')
            res+='5';
            else if(s[i]=='R')
            res+='6';
            else
            res+='0';
        }
        for(int i = 0;i<res.size();i++)
        {
            if(res[i]!=res[i+1]&&res[i]!='0')
            cout<<res[i];
        }
        cout<<endl;
    }
}

1126: 4111 浮点数格式

题目描述

输入n个浮点数,要求把这n个浮点数重新排列后再输出。

输入

第1行是一个正整数n(n <= 10000),后面n行每行一个浮点数,保证小数点会出现, 浮点数的长度不超过50位,注意这里的浮点数会超过系统标准浮点数的表示范围。

输出

n行,每行对应一个输入。要求每个浮点数的小数点在同一列上,同时要求首列上不会全部是空格。

样例输入 复制

2
-0.34345
4545.232

样例输出 复制

  -0.34345
4545.232
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    vector<int> a;
    vector<string> s;
    cin>>n;
    while(n--)
    {
        string str;
        cin>>str;
        for(int i = 0;i<str.size();i++)
        {
            if(str[i]=='.')
            {
                a.push_back(i);
                break;
            }
        }
        s.push_back(str);
    }
    vector<int> copy;
    for(int i = 0;i<a.size();i++)
    {
        int tem = a[i];
        copy.push_back(tem);
    }
    sort(copy.begin(),copy.end());
    int max = copy[copy.size()-1];
    for(int i = 0;i<s.size();i++)
    {
        if(a[i]!=max)
        {
            int gap = max-a[i];
            for(int j =0;j<gap;j++)
            cout<<' ';
            cout<<s[i]<<endl;
        }
        else
        cout<<s[i]<<endl;
    }
    return 0;
}

1127: 4112 487-3279

题目描述

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Ginos订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。
电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:
A、B和C映射到2
D、E和F映射到3
G、H和I映射到4
J、K和L映射到5
M、N和O映射到6
P、R和S映射到7
T、U和V映射到8
W、X和Y映射到9
Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。
如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)。
你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。

输入

输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。

输出

对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.

样例输入 复制

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

样例输出 复制

310-1010 2
487-3279 4
888-4567 3
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    long long int n;
    cin>>n;
    vector<string> str;
    vector<string> copy;
    int count[10000] = {0};
    //先存数
    while(n--)
    {
        string a;
        cin>>a;
        for(int j = 0;j<a.size();j++)
        {
            if(a[j]=='-')
            a.erase(j,1);
            if(a[j]=='A'||a[j]=='B'||a[j]=='C')
            a[j] = '2';
            if(a[j]=='D'||a[j]=='E'||a[j]=='F')
            a[j] = '3';
            if(a[j]=='G'||a[j]=='H'||a[j]=='I')
            a[j] = '4';
            if(a[j]=='J'||a[j]=='K'||a[j]=='L')
            a[j] = '5';
            if(a[j]=='M'||a[j]=='N'||a[j]=='O')
            a[j] = '6';
            if(a[j]=='P'||a[j]=='R'||a[j]=='S')
            a[j] = '7';
            if(a[j]=='T'||a[j]=='U'||a[j]=='V')
            a[j] = '8';
            if(a[j]=='W'||a[j]=='X'||a[j]=='Y')
            a[j] = '9';
        }
        str.push_back(a);
    }
    sort(str.begin(),str.end());
    int m = 0;
    for(int i = 0;i<str.size();i++)
    {
        if(str[i]==str[i+1])
        {
            count[m]++;
        }
        else
        {
            count[m]++;
            m++;
            copy.push_back(str[i]);
        }
    }
    int sum = 0;
    for(int i = 0;i<m;i++)
    {
        if(count[i] == 1)
        sum++;
    }
    if(sum!=m)
    {
         for(int i = 0;i<m;i++)
     {
        if(count[i]!=1)
        {
            string s = copy[i];
            printf("%c%c%c-%c%c%c%c %d\n",s[0],s[1],s[2],s[3],s[4],s[5],s[6],count[i]);
        }
     }
    }
    else
    {
        printf("No duplicates.");
    }
    return 0;
}

1128: 4113 粗心的打字员

题目描述

Tony是一个粗心的打字员,他总是犯同样的错误。更糟糕的是,光标键坏了,因此他只能用退格键回到出错的地方,纠正以后,原来正确字符还得重新输入。
现在让我们帮助Tony找出至少需要多长时间才能纠正他的错误。

输入

输入文件的第一行是一个整数N,表示测试数据的组数。接下来有N组测试数据。
每组测试数据占3行:
第1行是一个正整数t(t <= 100),表示Tony删除或者输入一个字符所花的时间。
第2行是正确的文本内容。
第3行是Tony输入的文本内容。
注意:文本包含都是可读字符。每行文本长度不超过80。

输出

对每组测试数据,输出为Tony纠正错误所花的最少时间,占一行。

样例输入 复制

2
1
WishingBone
WashingBone
1
Oops
Oooops

样例输出 复制

20
6
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int t;
        cin>>t;
        while(t--)
        {
            string s,t;
            cin>>s>>t;
            int min = s.size()<t.size()?s.size():t.size();
            int res = 0;int index = 0;
            for(int i = 0;i<min;i++)
            {
                if(s[i]!=t[i])
                {
                    index = i;
                    break;
                }
                else
                {
                    continue;
                }
            }
            res = t.size()-index+s.size()-index;
            cout<<res<<endl;
        }
    }
    return 0;
}

1129: 4114 单词逆序

题目描述

对于每个单词,在不改变这些单词之间的顺序下,逆序输出每个单词。
这个问题包括多组测试数据。第1行是一个整数M,紧接着是一个空行,然后是M组测试数据,每组数据之间有一个空行。要求输出M个输出块。每个输出块之间有一个空行。

输入

第1行为一个整数M,表示测试数据的组数。然后是一个空行,紧接着是M组测试数据,每组测试数据开始是一个正整数N,再是N行测试数据,包含若干个单词,单词之间用一个空格隔开,每个单词仅由大小写字母字符组成。

输出

对每组数据中的每个测试数据,输出一行。

样例输入 复制

1

3
I am happy today
To be or not to be
I want to win the practice contest

样例输出 复制

I ma yppah yadot
oT eb ro ton ot eb
I tnaw ot niw eht ecitcarp tsetnoc

 

#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    int m;
    cin>>m;
    while(m--)
    {
        int n;
        cin>>n;
        getchar();
        string str;
        while(n--)
        {
            string tem;string s0;
            getline(cin,str);
            for(int i = 0;i<str.size();i++)
            {
                if(str[i]!=' ')
                    s0+=str[i];
                else
                {
                    reverse(s0.begin(),s0.end());
                    tem+=s0+' ';
                    s0.clear();
                }
            }
            cout<<tem;
            for(int i = str.size()-1;i>=0;i--)
            {
                if(str[i]!=' ')
                cout<<str[i];
                else
                break;
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值