题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串”I am a student.”,则输出”student. a am I”.
解题思路:
先对整个字符串从头到尾翻转一次,然后再重头扫描.遇到空格或者到达末尾,就再翻转一次.
总结:
1.字符串string,使用empty判断是否为空
2.c类型的字符串 char *str,使用 *str==’\0’,判断是否到达末尾.c++类型字符串string,不能使用str[str.length()],会被判定为越界行为;只能够使用length()本身判定是否到达末尾.
3.在机子测试时,写了两种代码.这里先假设函数参数是 char 类型,不是string类型,因为我原来是按照char 做的.
第一种情况
char *p="I am a student.";
char *new_str=ReverseSentence(p);
报错:段错误,segmentation fault.
第二种情况:
char p[]=
{'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.','\0'}
char *new_str=ReverSentence(p);
顺利运行.
很疑惑,去查了一下资料,发现问题.
(1)先说明char []和char *区别.
char str1[]=”aaa”;
char str2[]=”aaa”;
使用char[]赋值,编译器会直接开辟空间,然后把字符串复制进去.
上面的str1和str2指向的地址不同.
char *str1=”bbb”;
char *str2=”bbb”;
使用char*会使指针指向全局字符串常量,上面就是指指向”bbb”这个常量
上面的str1和str2指向的地址是相同的
(2)由于是字符串常量,类型是const char* const,意思是指针和指针指向的值都是不可以改变的.只能访问.
(3)所以,不要想着对char str里面的值进行改变.通常我们使用char ,都是用于指向已经存在的指针,我们只是想拷贝多一份用于操作.要想char字符串中的值能够改变,就只能把它开在堆或者栈中
栈:char[]
堆:new
下面是算法代码
void Reverse(std::string& str,int left,int right){
if(str.empty() || right<left){
return;
}
for(;left<right;left++,right--){
char temp=str[left];
str[left]=str[right];
str[right]=temp;
}
}
std::string ReverseSentence(std::string str) {
if(str.empty()){
return "";
}
int length=str.length()-1;
Reverse(str,0,length);
int left=0;
int right=0;
while(left<length+1){
if(str[right]==' ' || right==length+1){
Reverse(str,left,right-1);
right++;
left=right;
}else{
right++;
}
}
return str;
}