牛客考研复试上机题 字符串专题:

KY5 反序输出

描述

输入任意4个字符(如:abcd), 并按反序输出(如:dcba)

输入描述:

题目可能包含多组用例,每组用例占一行,包含4个任意的字符。

输出描述:

对于每组输入,请输出一行反序后的字符串。 具体可见样例。

示例1

输入:

Upin
cvYj
WJpw
cXOA

复制输出:

nipU
jYvc
wpJW
AOXc

解题思路:

本题需用low,high指针前后夹击字符串数组,在每一次循环的过程中将两字符进行交换即可

#include<stdio.h>
#include<cstring>

void reverse(char *s){
    int low = 0,high = strlen(s)-1;
    while(low <= high){
        char temp;
        temp = s[low];
        s[low] = s[high];
        s[high] = temp;
        low++;
        high--;
    }
}

int main(){
    char s[100];
    while(scanf("%s",&s) != EOF){
        reverse(s);
        puts(s);
    }
}

KY74 字符串排序

描述

 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的结果

输入描述:

 一个字符串,其长度n<=20

输出描述:

 输入样例可能有多组,对于每组测试样例, 按照ASCII码的大小对输入的字符串从小到大进行排序,输出排序后的结果

示例1

输入:

dcba

复制输出:

abcd

解题思路:本人初学C++ STL本题采用sort函数对对字符串进行排序就不自己写排序函数了

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int main(){
    char s[100];
    cin>>s;
    sort(s,s+strlen(s));//此处sort排序的范围为[s,s+strlen(s))前闭区间后开区间
    cout<<s<<endl;
}

KY208 字符串连接

描述

不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。

输入描述:

每一行包括两个字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据, 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。 输出连接后的字符串。

示例1

输入:

abc def

复制输出:

abcdef
#include<iostream>
#include<cstring>
using namespace std;

int main(){
    char s1[300],s2[100];
    while(scanf("%s %s",&s1,&s2) != EOF){
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        int n = 0;
        while(n < len2){
            s1[len1+n] = s2[n];//设置一计数器从末尾开始连接即可
            n++;
        }
        s1[len1+n] = '\0';
        cout<<s1<<endl;  
    }
}

KY227 回文字符串

描述

给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的。

输入描述:

输入包括一行字符串,其长度不超过1000。

输出描述:

可能有多组测试数据,对于每组数据,如果是回文字符串则输出"Yes!”,否则输出"No!"。

示例1

输入:

hellolleh
helloworld

复制输出:

Yes!
No!

解题思路:本题用双指针low high指针前后扫描很容易得出答案

#include<iostream>
#include<cstring>
using namespace std;

bool isHwstr(char *s){
    int low,high;//双指针前后循环扫描
    low = 0;
    high = strlen(s)-1;
    bool flag = false;
    while(low <= high){
        if(s[low] == s[high]){
            flag = true;
            low++;
            high--;
        }else{
            flag = false;
            return flag;
        }
    }
    return flag;
}

int main(){
    char s[100];
    while(cin>>s){
        if(isHwstr(s)){
            cout<<"Yes!"<<endl;
        }else{
            cout<<"No!"<<endl;
        }
    }
}

KY18 特殊乘法

描述

写个算法,对2个小于1000000000的输入,求结果。 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5

输入描述:

两个小于1000000000的数

输出描述:

输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。

示例1

输入:

123 45

复制输出:

54
#include<iostream>
#include<string>

using namespace std;


int main(){
    string op1;
    string op2;//由于是非常大的数,所以此处用字符串模拟整数
    int res = 0;
    while(cin >> op1 >> op2){
        for(int i = 0; i < op1.size(); ++i){
            for(int j = 0; j < op2.size(); ++j){
                res += (op1[i] - '0') * (op2[j] - '0');//用了字符在计算机内部的ASCII码来计算
            }           
        }
        cout<< res <<endl;
        
    }
        
}

KY33 密码翻译

描述

在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。

输入描述:

读取这一行字符串,每个字符串长度小于80个字符

输出描述:

对于每组数据,输出每行字符串的加密字符串。

示例1

输入:

Hello! How are you!

复制输出:

Ifmmp! Ipx bsf zpv!

复制

示例2

输入:

zzz

复制输出:

aaa

#include<iostream>
#include<string>

using namespace std;

int main(){
    string str;
    while(getline(cin, str)){ // 此处由于测试用例中有空格而cin 与 scanf遇到空格就会结束所以此处可以用getline() 或者 gets()可以解决输入不了空格的问题
        for(int i = 0; i < str.size(); ++i){
            if((str[i] >= 'a' && str[i] <= 'y') || (str[i] >= 'A' && str[i] <= 'Y')){
                str[i] += 1;
            }else if(str[i] == 'z'){
                str[i] = 'a';
            }else if(str[i] == 'Z'){
                str[i] = 'A';
            }                                    
        }
        cout<< str<<endl;        
    }
        
}

该题又学到了新的东西,在C++STL中有count(a.begin(), a.end(), 'a')这个函数可以统计第三个参数在a字符串中的出现的次数。具体看代码

KY127 统计字符

描述

    统计一个给定字符串中指定的字符出现的次数。

输入描述:

    测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串。注意这里的字符串包含空格,即空格也可能是要求被统计的字符之一。当读到'#'时输入结束,相应的结果不要输出。

输出描述:

    对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出:     c0 n0     c1 n1     c2 n2     ...     其中ci是第1行中第i个字符,ni是ci出现的次数。

示例1

输入:

I
THIS IS A TEST
i ng
this is a long test string
#

复制输出:

I 2
i 3
  5
n 2
g 2

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>

using namespace std;


/*int main(){
    string s1;
    string s2;
    int res[128] = {0};
    
    while(getline(cin, s1)){
        for(int i = 0; i < 126; ++i){
            res[i] = 0;
        }
        if(s1[0] == '#'){
            break;
        }
        getline(cin, s2);
        for(int i = 0; i < s2.size(); ++i){
            res[s2[i] - '\0']++;
                      
        }        
        for(int i = 0; i < s1.size(); ++i){
            printf("%c %d\n", s1[i], res[s1[i]-'\0']);
            
        }
        
    }//hash法,该方法是开辟了一个存储ascii码的数组,该数组将要统计的字符串中出现的字符全都进行统计之后将第一个字符串中的字符再筛选出来即可
        
}*/

int main(){
    string s1, s2;
    while(getline(cin, s1) && s1 != "#"){
        getline(cin, s2);
        for(int i = 0; i < s1.size(); ++i){
            cout<<s1[i]<<' '<<count(s2.begin(), s2.end(), s1[i])<<endl;//运用了头文件#include<algorithm>中的count函数
                       
        }
               
    }
              
}

KY113 字母统计

描述

输入一行字符串,计算其中A-Z大写字母出现的次数

输入描述:

案例可能有多组,每个案例输入为一行字符串。

输出描述:

对每个案例按A-Z的顺序输出其中大写字母出现的次数。

示例1

输入:

DFJEIWFNQLEF0395823048+_+JDLSFJDLSJFKK

复制输出:

A:0
B:0
C:0
D:3
E:2
F:5
G:0
H:0
I:1
J:4
K:2
L:3
M:0
N:1
O:0
P:0
Q:1
R:0
S:2
T:0
U:0
V:0
W:1
X:0
Y:0
Z:0

#include<bits/stdc++.h>

using namespace std;

int res[128] = {0};

int main(){
    string s1;
    while(getline(cin, s1)){
        for(int i = 0; i < s1.size(); ++i){
            res[s1[i]]++;
        }
        for(int i = 'A' - '\0'; i <= 'Z'- '\0'; ++i){
            cout<<(char)i<<':'<<res[i]<<endl;
                        
        }
        
               
    }//依旧是hash法
        
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值