华为机试编程试题二

1.字符个数统计

题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。

输入描述:
输入N个字符,字符在ACSII码范围内。

输出描述:
输出范围在(0~127)字符的个数。

示例1
输入
abc
输出
3

#include<iostream>
#include<string>
using namespace std;
int diffCharNum(string &str){
    int num[128]={0};
    int j,sum=0;
    if(str.length()>0){
        for(int i=0;i<str.length()&&str[i]!='\n';i++){
            j=(int)str[i];
            if(j>=0&&j<=127){
                ++num[j];
            }
        }
    }
    for(j=0;j<128;j++){
        if(num[j]>0)
            sum++;
    }
    return sum;
}
int main(){
    string s;
    cin>>s;
    cout<<diffCharNum(s);
    return 0;
}

2.字符串加解密

题目描述
1、对输入的字符串进行加解密,并输出。

2加密方法为:

当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;

当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;

其他字符不做变化。

3、解密方法为加密的逆过程。

接口描述:

实现接口,每个接口实现1个基本操作:

void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出

说明:

1、字符串以\0结尾。

2、字符串最长100个字符。

int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出

说明:

1、字符串以\0结尾。

2、字符串最长100个字符。

输入描述:
输入说明
输入一串要加密的密码
输入一串加过密的密码

输出描述:
输出说明
输出加密后的字符
输出解密后的字符

示例1
输入
abcdefg
BCDEFGH
输出
BCDEFGH
abcdefg

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
void Encrypt(const string& aucPassword, char aucResult[101]){
    if(aucPassword.size()>100||aucPassword.size()<1)
        return ;
    int i;
    for(i=0;i<aucPassword.size();i++){
        if(aucPassword[i]>='a'&&aucPassword[i]<='z'){
            if(aucPassword[i]=='z')
                aucResult[i]='A';
            else 
                aucResult[i]=aucPassword[i]-31;//aucResult[i]=aucPassword[i]-32+1;
        }else if(aucPassword[i]>='A'&&aucPassword[i]<='Z'){
            if(aucPassword[i]=='Z')
                aucResult[i]='a';
            else 
                aucResult[i]=aucPassword[i]+33;//aucResult[i]=aucPassword[i]+32+1;            
        }else if(aucPassword[i]>='0'&&aucPassword[i]<='9'){
            if(aucPassword[i]=='9')
                aucResult[i]='0';
            else 
                aucResult[i]=aucPassword[i]+1;//aucResult[i]=aucPassword[i]+32+1;              
        }else{
            aucResult[i]=aucPassword[i];
        }
    }
    aucResult[i]='\0';
} 
int unEncrypt(char result[101], const string& password){
    if(password.size()<1 || password.size()>100)
        return 0;
    int i;
    for(i=0;i<password.size();i++){
        if(password[i]>='a'&&password[i]<='z'){
            if(password[i]=='a')
                result[i]='Z';
            else 
                result[i]=password[i]-33;//aucResult[i]=aucPassword[i]-32+1;
        }else if(password[i]>='A'&&password[i]<='Z'){
            if(password[i]=='A')
                result[i]='z';
            else 
                result[i]=password[i]+31;//aucResult[i]=aucPassword[i]+32+1;            
        }else if(password[i]>='0'&&password[i]<='9'){
            if(password[i]=='0')
                result[i]='9';
            else 
                result[i]=password[i]-1;//aucResult[i]=aucPassword[i]+32+1;              
        }else{
            result[i]=password[i];
        }
    }
    result[i]='\0';
    return 1;
}
int main(){
    string aucPassword;
    string password;
    while(cin>>aucPassword>>password){
        char result1[101];
        char result2[101];
        Encrypt(aucPassword,result1);
        unEncrypt(result2,password);
        cout<<result1<<endl;
        cout<<result2<<endl;
    }
    return 0;
}

3.单词倒排

题目描述
对字符串中的所有单词进行倒排。

说明:

1、每个单词是以26个大写或小写英文字母构成;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

输入描述:
输入一行以空格来分隔的句子

输出描述:
输出句子的逆序

示例1
输入
I am a student
输出
student a am I

#include<iostream>
#include<string>//getline(cin,str);
#include<cstring>//strtok
#include <stack>
using namespace std;
int main(){
    string str;
    while(getline(cin,str)){
        stack<char *> ss;
        char *s;
        char delim[]=" ";//本意想用正则表达式[^a-zA-Z]+
        char *strc=new char[strlen(str.c_str())+1];
        strcpy(strc,str.c_str());
        for(int i=0;i<strlen(strc);i++){//将英文大小写字母以及空格外的字符转换成空格字符
            if(!((strc[i]>='a'&&strc[i]<='z')||(strc[i]>='A'&&strc[i]<='Z')||strc[i]==' '))
                strc[i]=' ';
        }
        s=strtok(strc,delim);
        while(s!=NULL){
            ss.push(s);
            s=strtok(NULL,delim);
        }
        while(!ss.empty()){
            cout<<ss.top();
            if(ss.size()>1)
                cout<<" ";
            ss.pop();
        }
        cout<<endl;
        delete []strc;
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值