自己练习 字符串

字符串操作  自己;练习  P53 https://www.nowcoder.com/practice/5928127cc6604129923346e955e75984?tpId=61&tqId=29517&tPage=1&ru=/kaoyan/retest/1002&qru=/ta/pku-kaoyan/question-ranking // write your code here cpp
#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
using namespace std;


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

    return 0;
}


单词替换  P53  习题4.2
/*
解题思路:先将s分成各个单词,将每个单词存在向量中,然后取出向量中的元素,逐个与a比较,若相等则替换输出。
注:
istream& getline ( istream &is , string &str , char delim );
其中 istream &is 表示一个输入流,譬如cin;
string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)。
*/
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
    string s,a,b;
    vector<string> words;  //用来保存各个单词
    words.push_back(""); //???
    getline(cin,s);  //为了接受一行带空格的字符串
    cin>>a>>b;
    for(int i=0,j=0;i<s.size();++i){
        //分割单词,这是核心。
        if(s[i]!=' ')
            words[j] += s[i];
        else{
            words.push_back("");
            ++j;
        }

    }
    for(int i=0;i<words.size();++i){  //替换
        if(words[i]==a)
            words[i]=b;
    }
    for(int i=0;i<words.size();++i){  //输出
        cout<<words[i]<<" ";
    }
    return 0;
}


同上题(自己写的方法  最后没有通过   通过率90%)
/**
 * 确实有问题  例如连续CCCCCC
用例:
azure C silver C orange blue AAAA azure silver red gold CCCCC orange CCCC orange gold III BBB azure CCCCCC
CCC
silver

对应输出应该为:

azure C silver C orange blue AAAA azure silver red gold CCCCC orange CCCC orange gold III BBB azure CCCCCC

你的输出为:

azure C silver C orange blue AAAA azure silver red gold silverCC orange silverC orange gold III BBB azure silversilver

用例:
CCCCCC III A BBB CCCCCC AAAA III CCCCCC A AAAA CCCC CCC AAAA gold CC CC CC A BBB AAAA
CC
white

对应输出应该为:

CCCCCC III A BBB CCCCCC AAAA III CCCCCC A AAAA CCCC CCC AAAA gold white CC white A BBB AAAA

你的输出为:

CCCCCC III A BBB CCCCCC AAAA III CCCCCC A AAAA CCCC CCC AAAA gold white white white A BBB AAAA

这里应该是OJ错了
https://www.nowcoder.com/practice/5b58a04679d5419caf62c2b238e5c9c7?tpId=61&tqId=29518&tPage=1&ru=%2Fkaoyan%2Fretest%2F1002&qru=%2Fta%2Fpku-kaoyan%2Fquestion-ranking
 */

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


int main(){
    string str1,str2,str3;
//    cin>>str1; //不对  与空格停止
    getline(cin,str1);
    getline(cin,str2);
    getline(cin,str3);
    //好像没有与PHP直接功能的函数
    int found;
    while(true){
        found = str1.find(' ' + str2+' ');
        if(found != string::npos){
            str1.replace(found,str2.size()+2,' ' + str3 + ' ');
        }else break;
    }
    found = str1.find(str2);
    if(found == 0 && str1[str1.size()] == ' '){

        str1.replace(found,str2.size(),str3);
    }

    found = str1.find(str2);
    if(found != string::npos && found + str2.size() + 1 == str1.size()){

        str1.replace(found,str2.size(),str3);
    }

    cout << str1;
    return 0;
}




//首字母大写 P53
//按照上个题目的模板来   CLion看着还行  但是 OJ通过率为0   (没时间的话暂略)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
    string s;
    vector<string> words;  //用来保存各个单词
    words.push_back(""); //???
    getline(cin,s);  //为了接受一行带空格的字符串

    for(int i=0,j=0;i<s.size();++i){
        //分割单词,这是核心。
        if(s[i]!=' ' && s[i]!='\t' && s[i]!='\r' && s[i]!='\n')
            words[j] += s[i];
        else{
            words.push_back("");
            ++j;
        }

    }
    for(int i=0;i<words.size();++i){  //替换
//        cout<<words[i].at(0)<<"-";
        if(words[i].at(0) >= 'a' && words[i].at(0) <= 'z')
            words[i].at(0) = words[i].at(0) - ('a' - 'A');
    }
    for(int i=0;i<words.size();++i){  //输出

        cout<<words[i];
        if(i != words.size() - 1) cout<<" ";

    }
    return 0;
}
AC
#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    getline(cin,s);
    for(int i=0;i<s.length();i++){
        if(i==0)
            s[i]=toupper(s[i]);
        else{
            if(s[i-1]==' '||s[i-1]=='\t'||s[i-1]=='\r'||s[i-1]=='\n')
                s[i]=toupper(s[i]);
        }
    }
    cout<<s;
}
AC
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{

    char str[200] = " ";//巧妙的处理第一个  或者在下面分支写
    gets(str + 1); //!!!!
    //如果在C/C++中,这个str应该是指向字符数组的指针gets(str+1)表示从控制台输入一个字串,放入str+1位置
    
    for(int i = 1; i < strlen(str); i++)
        if((str[i-1] == ' ' || str[i-1] == '\t') && str[i] >= 'a' && str[i] <= 'z')
            str[i] -= 32;

    for(int i = 1; i < strlen(str); i++)
        printf("%c", str[i]);
    printf("\n");

    return 0;
}


浮点数加法   答案写的真好【666】
//写得真好  浮点数相加
/**
向string后面加多个字符
string s1 = “hello “;
s1.append(4,’!’); //在当前字符串结尾添加4个字符!
s1 = “hello !!!!”;
 其他暂略
 https://blog.csdn.net/wxn704414736/article/details/78551886
 https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8?tpId=61&tqId=29551&tPage=3&ru=/kaoyan/retest/1002&qru=/ta/pku-kaoyan/question-ranking
 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
#define _for(i, a, b) for (int i = a; i < b; ++i)
#define mem(a, b) memset(a, b, sizeof(a))
struct bign
{
    int ilen;     //整数部分的长度
    int flen;     //小数部分的长度
    int in[1010]; //整数部分数字
    int fn[1010]; //小数部分数字
    bign()
    {
        ilen = 0, flen = 0;
        mem(in, 0), mem(fn, 0);
    }
};
//让2个浮点数的小数部分长度相同
void cmp(string &a, string &b)
{
    int lena = a.length(), lenb = b.length();
    int posa = a.find('.'), posb = b.find('.');
    lena -= posa, lenb -= posb;
    lena < lenb ? a.append(lenb - lena, '0') : b.append(lena - lenb, '0');
}
//将字符串转换为大整数
bign change(string s)
{
    bign c;
    int len = s.length();
    int pos = s.find('.');
    _for(i, 0, len)
    {
        if (i == pos)
            continue;
        i < pos ? c.in[c.ilen++] = s[pos - i - 1] - '0' : c.fn[c.flen++] = s[len - i + pos] - '0';
    }
    return c;
}
//高精度a + b   这一块类似于大整数运算
bign add(bign a, bign b)
{
    bign c;
    int carry = 0;
    //对小数部分进行处理
    _for(i, 0, a.flen)
    {
        int tmp = a.fn[i] + b.fn[i] + carry;
        c.fn[c.flen++] = tmp % 10;
        carry = tmp / 10;
    }
    //对整数部分进行处理
    _for(i, 0, max(a.ilen, b.ilen))
    {
        int tmp = a.in[i] + b.in[i] + carry;
        c.in[c.ilen++] = tmp % 10;
        carry = tmp / 10;
    }
    if (carry != 0)
    {
        c.in[c.ilen++] = carry;
    }
    return c;
}
//输出bign
void print(bign a)
{
    //打印整数部分
    for (int i = a.ilen - 1; i >= 0; --i)
    {
        printf("%d", a.in[i]);
    }
    //打印小数点
    printf(".");
    //打印小数部分
    for (int i = a.flen - 1; i >= 0; --i)
    {
        printf("%d", a.fn[i]);
    }
    printf("\n");
}
int main()
{
    string s1, s2;
    while (cin >> s1 >> s2)
    {
        cmp(s1, s2);
        bign a = change(s1), b = change(s2);
        print(add(a, b));
    }
    return 0;
}


//https://www.nowcoder.com/practice/f89f96ea3145418b8e6c3eb75773f65a?tpId=62&tqId=29472&tPage=2&ru=/kaoyan/retest/2002&qru=/ta/sju-kaoyan/question-ranking
//将其后缀子串进行排序  容易  自己直接写出来
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>  //没写此行 clion  用sort居然同归了  坑  OJ没通过

using namespace std;
//bool compare(string a,string b){
//    return a>b;
//}
int main(){
    string str;
    vector<string> myStrings;
    while(cin>>str){
        myStrings.clear();

        for(int i=0;i<str.size();++i){
            myStrings.push_back(str.substr(i));
        }
        sort(myStrings.begin(),myStrings.end());
//        sort(myStrings.begin(),myStrings.end(),compare); //反序
        for(int i=0;i<myStrings.size();++i){
            cout<<myStrings.at(i)<<endl;
        }


    }

    return 0;


}













全部评论

相关推荐

就用这个吧:支持多益再加一个空气使用费
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务