把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
2013-08-01 17:26
375 查看
题目:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
题目来源:http://blog.csdn.net/w397090770/article/details/8030317
同参考楼主的思想,也是用冒泡排序的思想求解。从字符串尾部扫描,将大写字母依次放到字符串的最后。
注意:如果字符串中包含不合法的字母(除了英文字母之外的字符,)则视为错误输入,程序会退出并设置错误标记invaluedInput为true。
#include <iostream> #include <string> using namespace std; //标记输入参数是否合法 bool invaluedInput = false; //是否为大写字符 bool IsUpper(char ch) { if(ch>='A' && ch<='Z') return true; else return false; } //是否为合法字符(合法字符为a-z ,A-Z) bool IsCharacter(char ch) { if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) return true; else return false; } void UpperBehindLower(char* str,int len) { if(NULL == str || len<=1) { invaluedInput = true; return; } char tmpch; int ahead = len-1; int behind = len-1; int tmp; while(ahead >= 0) { if(IsCharacter(str[ahead])) { //如果为大写字符,则将大写字符后的所有小写字符移到此大写字符前 if(IsUpper(str[ahead])) { tmpch = str[ahead]; for(tmp = ahead; tmp<behind; tmp++) { str[tmp] = str[tmp+1]; } str[tmp] = tmpch; behind--; ahead--; } else ahead--; } else { invaluedInput = true; cout<<"invaluedInput"<<endl; return ; } } } int main() { //不同的测试用例 //char str[] = "AaBCDcb"; // char str[] = "ABCDabcd"; //char str[] = "abcdABCD"; //char str[] = "abcd"; char str[] = "ABCD"; int len = strlen(str); cout<<str<<endl; UpperBehindLower(str,len); if(!invaluedInput) cout<<str<<endl; else cout<<"invaluedInput"<<endl; }
如果字符串的形式是形如:ABFJRFHfjdalkfka这种大写字母都在小写字母的前面,则可以采用如下解法:
1.将所有大写字母组成的字符串逆置。
2.将所有小写字母组成的字符串逆置。
3.将所有字符串逆置。
这种解法用的就是字符串循环移位的方法。
代码如下:
#include <iostream> #include <string> using namespace std; bool invaluedInput = false; //逆置字符串 bool ReverseStr(char* pAhead,char* pBehind) { if(NULL == pAhead || NULL == pBehind) { return false; } char tmp; while(pAhead < pBehind) { tmp = *pAhead; *pAhead = *pBehind; *pBehind = tmp; pAhead++; pBehind--; } return true; } bool UpperBehindLower(char str[],int len) { if(NULL == str || len < 2) { invaluedInput = true; return false; } //求字符串中大写字符串的长度 int lenUpper = 0; while(str[lenUpper] >='A' && str[lenUpper] <= 'Z') { lenUpper++; } lenUpper--; //分别逆置大写字符串,小写字符串,整个字符串。 ReverseStr(str,str+lenUpper); ReverseStr(str+lenUpper+1,str+len-1); ReverseStr(str,str+len-1); return true; } int main() { //char str[] = "ABCDEabcdef"; //char str[] = "Aabcdef"; //char str[] = "abcdef"; //char str[] = "ABCDEF"; //char str[] = "Aa"; char str[] = "A"; int len = strlen(str); cout<<str<<endl; UpperBehindLower(str,len); if(invaluedInput) cout<<"invaluedInput"<<endl; else cout<<str<<endl; return 0; }
相关文章推荐
- [面试算法]把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
- 腾讯2017年实习生编程题目(第二题)----2.算法基础-字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
- 字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗? 输入描述: 输入数据有多组
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
- 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗?
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间
- 把一个字符串的大写字母放到字符串的后面 ,各个字符的相对位置不变,不能申请额外的空间
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
- 将一个字符串的大写字母放到字符串的后面,各个字符串的相对顺序不改变,不能申请额外空间 左旋字符串的应用
- 把一个字符串中的大写字母放到后面,小写字母放到前面,并且相对位置不变
- 在一个字符串中把大写字母放到字符串中小写字母的后面(不能改变字母的相对位置)
- 不申请额外空间调整字符串大小写顺序,大写字母依次放到后面
- 将一个字符串中的大写字母放到小写字母的后面,而且移动后相对顺序不改变
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 26.在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置