一道面试题
2015-09-07 12:45
302 查看
编写一个方法,将字符串中的空格全部替换为“%20”,假设字符串有足够的空间新增字符,并且知道字符串的真实长度;
输入:“Mr John Smith”
输出: "Mr%20John%20Smith"
#include<string>
#include<iostream>
#include<memory>
#include<algorithm>
using std::endl;
using std::cin;
using std::cout;
using std::tr1::shared_ptr;
typedef std::string::iterator iterStr;
typedef struct{
iterStr pBegin;
iterStr pEnd;
}chk;
void changeString(std::string& str, const shared_ptr<chk>& pChk)
{
iterStr pBegin = pChk->pBegin;
iterStr pEnd = pChk->pEnd;
str.erase(pBegin, pEnd);
std::string curStr = { "%20" };
str.insert(pBegin, curStr.cbegin(), curStr.cend());
}
void changeAll(std::string& str)
{
int countRef = 0;
std::tr1::shared_ptr<chk> Chk = std::make_shared<chk>();
iterStr pBegin = str.begin();
while (pBegin != str.cend()){
if (*pBegin == ' ')
{
++countRef;
if (countRef == 1)
{
Chk->pBegin = pBegin;
}
else if (countRef == 2)
{
countRef = 0;
Chk->pEnd = pBegin+1;
changeString(str, Chk);
}
}
++pBegin;
}
if (countRef == 1 && pBegin == str.end())
{
Chk->pEnd = pBegin;
changeString(str, Chk);
}
}
int main()
{
std::string str = { " I am a People" };
changeAll(str);
/*
std::string str1 = { "%20" };
std::tr1::shared_ptr<chk> pChk = std::make_shared<chk>();
pChk->pBegin = str.begin()+1;
pChk->pEnd = str.begin()+3;
changeString(str, pChk);
*/
cout << str << endl;
int x;
cin >> x;
return 0;
}
输入:“Mr John Smith”
输出: "Mr%20John%20Smith"
#include<string>
#include<iostream>
#include<memory>
#include<algorithm>
using std::endl;
using std::cin;
using std::cout;
using std::tr1::shared_ptr;
typedef std::string::iterator iterStr;
typedef struct{
iterStr pBegin;
iterStr pEnd;
}chk;
void changeString(std::string& str, const shared_ptr<chk>& pChk)
{
iterStr pBegin = pChk->pBegin;
iterStr pEnd = pChk->pEnd;
str.erase(pBegin, pEnd);
std::string curStr = { "%20" };
str.insert(pBegin, curStr.cbegin(), curStr.cend());
}
void changeAll(std::string& str)
{
int countRef = 0;
std::tr1::shared_ptr<chk> Chk = std::make_shared<chk>();
iterStr pBegin = str.begin();
while (pBegin != str.cend()){
if (*pBegin == ' ')
{
++countRef;
if (countRef == 1)
{
Chk->pBegin = pBegin;
}
else if (countRef == 2)
{
countRef = 0;
Chk->pEnd = pBegin+1;
changeString(str, Chk);
}
}
++pBegin;
}
if (countRef == 1 && pBegin == str.end())
{
Chk->pEnd = pBegin;
changeString(str, Chk);
}
}
int main()
{
std::string str = { " I am a People" };
changeAll(str);
/*
std::string str1 = { "%20" };
std::tr1::shared_ptr<chk> pChk = std::make_shared<chk>();
pChk->pBegin = str.begin()+1;
pChk->pEnd = str.begin()+3;
changeString(str, pChk);
*/
cout << str << endl;
int x;
cin >> x;
return 0;
}
相关文章推荐
- 黑马程序员--类的本质
- 面试
- 谁说女子不如男
- C printf() 详解——printf('%08x',number); 程序员面试宝典中的一个错误 char * b=(char *)&a
- 成为优秀的码农要记住的八件事
- 黑马程序员--OC的Foundation框架之日期
- 面试题 13
- 黑马程序员--多态
- 程序员的自我修养——操作系统篇
- 程序员必备:技术面试准备手册
- 码农们可以优越,并且应该优越
- 面试题 12
- 操作系统常见面试题总结
- 黑马程序员—JAVA基础学习日记十——反射学习总结
- Java 面试高频提问知识点之:Set、List 和 Map 的区别
- 黑马程序员--OC的Foundation框架之字典
- 黑马程序员-Java基础:反射
- 黑马程序员-Java基础:多线程
- 黑马程序员-Java基础:IO
- 要做一个「程序员」还是「代码生成器」,值得思考?