刷题的一天——双指针2

1、编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

这个大概也是用双指针的方法,so easy。

代码:

class Solution {
public:
    void reverseString(vector<char>& s) {
    int i = 0;
    int j = s.size()-1;
    while(i<j){                //之前用的<=,其实应该不用=,简便一下就删掉了
        swap(s[i],s[j]);       //左右指针所指的字符交换位置
        i++;
        j--;
    }
    }
};

时间复杂度O(n);空间复杂度O(1)。

2、给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

先开始的时候没注意看题,结果做成了把所有内容反置(也就是栈的形式),虽然做错了,但还是写一下吧。

错误代码:

class Solution {
public:
    string reverseWords(string s) {
    string ans;
    int i =s.size();
    while(i>=0){                  //全部反置
    if (s[i] == ' '){     
        ans.push_back  (' ');
    }else{
        ans.push_back (s[i]);
    }
    i--;
    }
    return ans;
    }
};

正确代码:

class Solution {
public: 
    string reverseWords(string s) {
        int length = s.length();
        int i = 0;
        int start = 0;
        while (i < length) {
            int   start = i;    
            while (i < length && s[i] != ' ') {
                i++;
            }
            int left = start, right = i - 1;                //这里使得left和right在单词两边
            while (left < right) {                           //单词内部交换
                                            
              swap(s[left], s[right]);
              left++;
              right--;
            }
            while (i < length && s[i] == ' ') {           //如果i检测出空格则相对于没检测到空格多加1,也使得下一轮的left不等于right;
                i++;
            }
        }
        return s;
    }
};

但是这个题仅限于字符串可变语言,如:C/C++, Ruby, PHP, Swift;对于字符串不可变语言:Java, Python, C#, Javascript, Go的话,这个方法就不好使了。

还有就是有些题解把start=i放在while(i<length)的后面,我觉得不大合理,这样容易导致start和i没办法保证在一个单词的左右边吧?但是输出结果没问题,我觉得有点迷。

这里最后还是时间复杂度为O(n),空间复杂度O(1)。同时也可以创建另一个字符串用栈的方式达成目的,但是相对来说空间复杂度会更大,为O(n),所以这里便不再阐述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值