自己练习 字符串
字符串操作 自己;练习 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;
} /**
* 确实有问题 例如连续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;
} 