算法第四天 双指针

完成日期:7月13号
今日总结:

  1. 获取数组长度记得要减1
  2. 多多使用STL,比如swap()方法

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

// 方法:双指针
void reverseString(vector<char>& s) {
       char a;
       int left=0, right=s.size()-1;  // 记得要减1,你次次忘记
       while(left<right){
           a = s[left];
           s[left++] = s[right];
           s[right--] = a;
       }
   }

// 写法二:可以是STL的swap方法
void reverseString(vector<char>& s) {
       int left=0, right=s.size()-1;
       while(left<right){
           swap(s[left++], s[right--]);  // 方便很多
       }
   }

557. 反转字符串中的单词 III

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

// 方法一:使用额外的数组空间
string reverseWords(string s) {
       string res;
       int len = s.length();
       int i=0;
       while(i<len){
           int start = i;
           while(s[i]!=' ' && i<len){
               i++;
           }
           for(int j=start; j<i; ++j){
               res.push_back(s[i-j+start-1]);
           }
           if(i++<len) res.push_back(' ');
       }
       return res;
    }

// 方法二:使用头尾双指针(旋转数组常用)
string reverseWords(string s) {
        int i=0;
        int len = s.size();
        while(i<len){
            int start = i;  // 头指针
            while(s[i]!=' ' && i<len){
                i++;
            }
            int end = i-1;  // 尾指针
            while(start<end){
                swap(s[start++], s[end--]);
            }
            i++;
        }
        return s;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容