程序员面试经典--字符串
字符串切割函数汇总。
http://www.cnblogs.com/MikeZhang/archive/2012/03/24/MySplitFunCPP.html
1题目描述
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
"aeiou"
返回:True
"BarackObama"
返回:False
1.利用map做
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Different { public: bool checkDifferent(string iniString) { // write code here map<char, int>a; int i; for (i = 0; i<iniString.size(); i++){ a[iniString[i]]++; } for (auto it = a.begin(); it!=a.end(); it++){ if (it->second>1) return false; } return true; } };
2题目描述
请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。
给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。
"This is nowcoder"
返回:"redocwon si sihT"
对调字符串。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Reverse { public: string reverseString(string iniString) { // write code here int len = iniString.size(); int ch; for(int i=0;i<len/2;i++){ ch = iniString[i]; iniString[i] = iniString[len-i-1]; iniString[len-i-1] = ch; } return iniString; } };
3题目描述
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。
给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。
"This is nowcoder","is This nowcoder"
返回:true
"Here you are","Are you here"
返回:false
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Same { public: bool checkSam(string stringA, string stringB) { sort(stringA.begin(),stringA.end()); sort(stringB.begin(),stringB.end()); return stringA.compare(stringB)==0; } };
4题目描述
请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。
给定一个string iniString 为原始的串,以及串的长度 intlen, 返回替换后的string。
"Mr John Smith”,13
返回:"Mr%20John%20Smith"
”Hello World”,12
返回:”Hello%20%20World”
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Replacement { public: string replaceSpace(string iniString, int length) { // write code here string s = "%20"; int i=0; while(iniString[i]!='\0'){ if(iniString[i] == ' '){ iniString.replace(i, 1, s);//将位置2开始的3个字符(345)换成abcde i = i+2; }else{ i++; } } return iniString; } };
5题目描述
利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
"aabcccccaaa"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Zipper { string num2str(double i) { stringstream ss; ss << i; return ss.str(); } public: string zipString(string iniString) { // write code here int len = iniString.size(); string s; int n = 0; char tmp = iniString[0]; for(int i=0;i<len;i++){ if(tmp == iniString[i]){ n++; }else{ s +=tmp; s +=num2str(n); tmp = iniString[i]; n=1; } } if(n>0){ s +=tmp; s +=num2str(n); } if(s.size()>=len){ return iniString; }else{ return s; } } };
6题目描述
假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。
"Hello world","worldhello "
返回:false
"waterbottle","erbottlewat"
返回:true
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class ReverseEqual { public: bool checkReverseEqual(string s1, string s2) { // write code here if(s1.size()!= s2.size()){ return false; } if(s1 == s2)return true; int len = s1.size(); while(len--){ char ch = s1[0]; s1.erase(0, 1); s1.append(1, ch); if(s1 == s2){ return true; } } return false; } };