acwing刷题指南4

//字符串

AcWing 760. 字符串长度

给定一行长度不超过 100 的非空字符串,请你求出它的具体长度。

输入格式

输入一行,表示一个字符串。注意字符串中可能包含空格。

输出格式

输出一个整数,表示它的长度。
字符串末尾无回车

输入样例:

I love Beijing.

输出样例:

15

思路:直接用getline()读入字符串,后用s.size()计算字符串长度

方案1:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    cout<<s.size()<<endl;
return 0;
}

方案2:

(fgets函数会把回车也读进来)
 

#include<bits/stdc++.h>

using namespace std;

int main()
{
    char s[105];
    int c = 0;
    fgets(s , 105 , stdin);

    for(int i = 0;s[i] && s[i] != '\n';i ++)  c ++;

    cout << c << endl;

    return 0;
}

761. 字符串中的数字个数

输入一行字符,长度不超过100,请你统计一下其中的数字字符的个数。

输入格式

输入一行字符。注意其中可能包含空格。

输出格式

输出一个整数,表示字数字字符的个数。

输入样例:

I am 18 years old this year.

输出样例:

2

解法1:常规套路,遍历一遍整个序列,判断是否有数字

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int cnt = 0,T;
    getline(cin,s);
    for(int i = 0;i < s.size();i++)
    {
        if(s[i] >='0' && s[i] <='9')
        {
            cnt++;
        }
    }
    cout<<cnt;
    return 0;

解法2:

思路:用isdigit()判断

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int cnt = 0;
    getline(cin, s);
    for(char c:s)//复制一个s字符串再进行遍历操作,但是复制一个字符串需要花费大量的时间,支持C++11

{
        if(isdigit(c))

{
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

这道题还可以运用auto

for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。

for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。

765. 字符串加空格

给定一个字符串,在字符串的每个字符之间都加一个空格。

输出修改后的新字符串。

输入格式

共一行,包含一个字符串。注意字符串中可能包含空格。

输出格式

输出增加空格后的字符串。

输入样例:

test case

输出样例:

t e s t   c a s e

为方便熟悉for(char c:s)的用法,这也算一道练习题

//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    for(char c : s) cout<<c<<" ";
    
    return 0;
}

763. 循环相克令(模拟题)

循环相克令是一个两人玩的小游戏。

令词为“猎人、狗熊、枪”,两人同时说出令词,同时做出一个动作——猎人的动作是双手叉腰;狗熊的动作是双手搭在胸前;枪的动作是双手举起呈手枪状。

双方以此动作判定输赢,猎人赢枪、枪赢狗熊、狗熊赢猎人,动作相同则视为平局。

现在给定你一系列的动作组合,请你判断游戏结果。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

接下来 T 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 HunterBearGun 中的一个,这三个单词分别代表猎人,狗熊和枪。

输出格式

如果第一个玩家赢了,则输出 Player1

如果第二个玩家赢了,则输出 Player2

如果平局,则输出 Tie

输入样例

3
Hunter Gun
Bear Bear
Hunter Bear

输出样例

Player1
Tie
Player2

解法1:用长度来判断是否符合条件

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin>>T;
    string a,b;
    while(T--)
    {
        cin>>a>>b;
        int soso = a.size(), alaso = b.size();
        if (soso - alaso == -1 || soso - alaso == -2 || soso - alaso == 3)
        cout << "Player1" << endl;
        else if (a == b)
            cout << "Tie" << endl;
        else cout << "Player2" << endl;
    }

    return 0;
}

解法2:

直接定义字符串,直接模拟即可

#include<bits/stdc++.h>
using namespace std;
int main ()

{
    int T;
    cin>>T;
    while(T--)

{
        string a,b;
        cin>>a>>b;
        if(a==b)puts("Tie");
        else if(a=="Hunter"&&b=="Gun"||a=="Bear"&&b=="Hunter"||a=="Gun"&&b=="Bear")
        puts("Player1");
                else puts("Player2");
    }
    return 0;
}

773. 字符串插入

有两个不包含空白字符的字符串 str 和 substr,str的字符个数不超过 10,substr 的字符个数为 33。(字符个数不包括字符串结尾处的 \0。)

将 sub str 插入到 str 中 ASCII 码最大的那个字符后面,若有多个最大则只考虑第一个。

输入格式

输入包括若干行,每一行为一组测试数据,格式为

str substr

输出格式

对于每一组测试数据,输出插入之后的字符串。

输入样例:

abcab eee
12343 555

输出样例:

abceeeab
12345553

 #include<bits/stdc++.h>
using namespace std;
int main()
{
    string s,sub;
    
    while(cin>>s>>sub)
    {
        int idx = 0;
        for(int i = 0;i<s.size();i++)
        if(s[i] > s[idx])
        {
            idx = i;
        }
         s.insert(idx+1,sub);//insert()函数表示插入 

//比如insert(i,s) 在原串下标为i的字符串str前插入字符串s
         cout<<s<<endl;
    }
    return 0;
}

772. 只出现一次的字符

给你一个只包含小写字母的字符串。

请你判断是否存在只在字符串中出现过一次的字符。

如果存在,则输出满足条件的字符中位置最靠前的那个。

如果没有,输出 no

输入格式

共一行,包含一个由小写字母构成的字符串。

数据保证字符串的长度不超过 100000。

输出格式

输出满足条件的第一个字符。

如果没有,则输出 no

输入样例:

abceabcd

输出样例:

e

#include<bits/stdc++.h>
using namespace std;
const int N = 100001;
int x[N];
int main()
{
    int idx = 0;
    string s;
    cin>>s;
    for(auto e:s)
    {
       x[e]++;
    }
    for(auto e:s)
    {
        if(x[e] == 1)
        { 
            cout<<e<<endl;
             return 0;
        }
    }
     cout<<"no"<<endl;
}

768. 忽略大小写比较字符串大小

一般我们用 strcmp 可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到 \0 为止。

如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。

但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如 Hello 和 hello 在忽略字母大小写时是相等的。

请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。

输入格式

输入为两行,每行一个字符串,共两个字符串。注意字符串中可能包含空格。

数据保证每个字符串的长度都不超过 8080。

输出格式

如果第一个字符串比第二个字符串小,输出一个字符 <

如果第一个字符串比第二个字符串大,输出一个字符 >

如果两个字符串相等,输出一个字符 =

输入样例:

Hello
hello

输出样例:

=

思路:直接遍历两个字符串即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    
    for(int i = 0;i < a.size();i++)
    if(a[i] >= 'A' && a[i] <= 'Z') a[i] += 32;
    
    for(int i = 0;i < b.size();i++)
    if(b[i] >= 'A' && b[i] <= 'Z')b[i] += 32;
    
    int c;
    c = strcmp(a.c_str(),b.c_str());
    if(c < 0) cout<<"<";
    else if(c == 0)cout<<"=";
    else if(c > 0) cout<<">";
    return 0;

767. 信息加密

在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。

现在给定一个字符串,对其进行加密处理。

加密的规则如下:

  1. 字符串中的小写字母,a 加密为 b,b 加密为 c,…,y 加密为 z,z加密为 a。
  2. 字符串中的大写字母,A 加密为 B,B加密为 C,…,Y 加密为Z,Z 加密为 A。
  3. 字符串中的其他字符,不作处理。

请你输出加密后的字符串。

输入格式

共一行,包含一个字符串。注意字符串中可能包含空格。

输出格式

输出加密后的字符串。

数据范围

输入字符串的长度不超过 100。

输入样例:

Hello! How are you!

输出样例:

Ifmmp! Ipx bsf zpv!

#include<bits/stdc++.h>
using namespace std; 
int main()
{
    string a;
    getline(cin,a);
    
    for(int i = 0;i < a.size();i++)
    {
        if(a[i] >= 'A' && a[i]<'Z'||a[i]>='a'&&a[i]<'z') a[i]++;
        else if(a[i] == 'Z' || a[i] == 'z') a[i] -= 25;
    }
    cout<<a;
    return 0;
}

64. 输出字符串

给定一个字符串 a,请你按照下面的要求输出字符串 bb。

给定字符串 a 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到 b 的第一个字符;

给定字符串 a 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到b 的第二个字符;

给定字符串 a 的倒数第二个字符的 ASCII 值加最后一个字符的 ASCII 值,得到 b 的倒数第二个字符;

给定字符串 a 的最后一个字符的 ASCII 值加第一个字符的 ASCII 值,得到b 的最后一个字符。

输入格式

输入共一行,包含字符串 a。注意字符串中可能包含空格。

数据保证字符串内的字符的 ASCII 值均不超过 63。

输出格式

输出共一行,包含字符串b。

输入样例:

1 2 3

输出样例:

QRRSd

思路:一般像有固定长度,依次向后的取,到最后面,再从第一个开始取,这种模型一般都可以用取余

可以参考蛇形矩阵那道题

 0->1 1->2......n-1->n n->0 可以用 i=(i+1)%(n+1)实现

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);//读入空格所需要的读入语句(对于字符串来说)
    
    for(int i = 0;i < a.size();i++)
    b += a[i]+a[(i+1)%a.size()];
    cout<<b;
    return 0;
}

AcWing 775. 倒排单词

编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。

输入格式

输入为一个字符串(字符串长度至多为100)。

输出格式

输出为按要求排序后的字符串。

输入样例:

I am a student

输出样例:

student a am I

思路:

res = I
res = am I
res = a am I

每次拼接都是用str往res的前面拼接,拼接的中间还要加上’ ‘(空格字符)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string str,std;
    while(cin>>str)
        std = str +' '+ std;
        cout<<std;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值