机试指南第四章字符串刷题总结

机试指南第四章字符串刷题总结

1、KY45 skew数

描述

在 skew binary 表示中,第 k 位的值 x[k] 表示 x[k]×(2^(k+1)-1)。每个位上的可能数字是 0 或 1,最后面一个非零位可以是 2,例如,10120(skew) = 1×(2^5-1) + 0×(2^4-1) + 1×(2^3-1) + 2×(2^2-1) + 0×(2^1-1) = 31 + 0 + 7 + 6 + 0 = 44。前十个 skew 数是 0、1、2、10、11、12、20、100、101、以及 102。

输入描述:

输入包括多组数据,每组数据包含一个 skew 数。

输出描述:

对应每一组数据,输出相应的十进制形式。结果不超过 2^31-1。

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int main(){
    string str;
    while(cin>>str){
        int result=0;
        int len = str.size();
        for(int i=0;i<len;i++){
            result +=(str[i]-'0')*(pow(2,len-i)-1);
        }
        cout<<result<<endl;
    }
    return 0;
}

2、KY46 单词替换

描述

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入描述:

每组数据输入包括3行,第1行是包含多个单词的字符串s,第2行是待替换的单词a(长度<=100),第3行是a将被替换的单词b(长度<=100)。s, a, b 最前面和最后面都没有空格。

输出描述:

每个测试数据输出只有 1 行, 将s中所有单词a替换成b之后的字符串。

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

int main(){
    string str,a,b;
    while(getline(cin,str)){
        getline(cin,a);
        getline(cin,b);
        str = " " + str + " ";
        a = " " + a + " ";
        b = " " + b + " ";
        int start;
        while(1){
            start=str.find(a);
            if(start==string::npos){
                break;
            }else{
                str.erase(start, a.size());
                str.insert(start, b);
            }
        }
        cout<<str.substr(1,str.size()-2)<<endl;
    }
    
}

3、KY57 首字母大写

描述

对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。 在字符串中,单词之间通过空白符分隔,空白符包括:空格(’ ‘)、制表符(’\t’)、回车符(’\r’)、换行符(’\n’)。

输入描述:

输入一行:待处理的字符串(长度小于100)。

输出描述:

可能有多组测试数据,对于每组数据, 输出一行:转换后的字符串。

示例1

输入:if so, you already have a google account. you can sign in on the right.
输出:If So, You Already Have A Google Account. You Can Sign In On The Right.
#include <iostream>

using namespace std;

int main(){
    string str;
    while(getline(cin,str)){
        if(str[0]>='a'&&str[0]<='z')
            str[0] = str[0] + 'A' -'a';
        for(int i=1;i<str.size();i++){
            if(str[i-1]==' '||str[i-1]=='\t'||str[i-1]=='\r'||str[i-1]=='\n'){
                if(str[i]>='a'&&str[i]<='z')
                str[i] = str[i] + 'A' -'a';
            }
        }
        cout<<str;
    }
    return 0;
}

4、KY79浮点数加法

描述

求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0

输入描述:

对于每组案例,每组测试数据占2行,分别是两个加数。

输出描述:

每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数

示例1

输入:
0.111111111111111111111111111111
0.111111111111111111111111111111
输出:
0.222222222222222222222222222222
#include <iostream>
#include <string.h>
using namespace std;

int main(){
    string str1,str2;
    /*************
    将其拆分成小数和整数方便一些
    **************/
    string d1,d2,f1,f2;
    while(cin>>str1>>str2){
        int dot1 = str1.find('.');
        int dot2 = str2.find('.');
        if(str1.size()-dot1>str2.size()-dot2){
            f1=str1.substr(dot1+1,str1.size());
            f2=str2.substr(dot2+1,str2.size());
        }else{
            f2=str1.substr(dot1+1,str1.size());
            f1=str2.substr(dot2+1,str2.size());
        }

        int carry=0;
        int temp=0;
        for(int i =f1.size()-1;i>=0;i--){
            if(i<f2.size()){
                temp = f1[i] - '0' + f2[i] - '0' + carry;
                carry = temp/10;
                f1[i] = char(temp%10 + '0');
            }
        }

        if(dot1>dot2){
            d1 = str1.substr(0,dot1);
            d2 = str2.substr(0,dot2);
        }else{
            d2 = str1.substr(0,dot1);
            d1 = str2.substr(0,dot2);
        }

        for(int i = d1.size()-1;i>=0;i--){
            int different = d1.size()-d2.size();
            if(i>=different){
                temp = d1[i] - '0' + d2[i - different] - '0' + carry;
                carry = temp/10;
                d1[i] = char(temp%10 + '0');
                if(i==0&&carry>0){
                    d1.insert(0," ");
                    d1[0]=char(carry+'0');
                }
            }else if(i<different&&carry>0){
                temp = d1[i] - '0' + carry;
                carry = temp/10;
                d1[i] = char(temp%10 + '0');
            }
        }
        cout<<d1<<"."<<f1<<endl;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JavaGPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值