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

题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串”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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值