剑指offer 面试题42 翻转单词顺序

来源:互联网 发布:android tomcat mysql 编辑:程序博客网 时间:2024/05/10 19:12

题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串”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;}
0 0
原创粉丝点击