Bootstrap

【算法】反转字符串中的单词、奇数在偶数后

目录

奇数在偶数后

解法一:双指针

复杂度

解法二:插入排序思想

复杂度

反转字符串中的单词

解法一:栈

复杂度

解法二:双指针

复杂度


奇数在偶数后

题目描述:

输入一个整数数组,实现一个接口来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。

解法一:双指针

#include <vector>
#include <algorithm> //std::swap
using namespace std;
class Solution
{
    public:
    //双指针
    void Func(vector<int>& v)
    {
        int left = 0,right=v.size();
        while(left<right)
        {
            while((left<right)&&(v[left] & 1))
            {
                left++;
            }
            while((left<right)&& !(v[right] & 1))
            {
                right--;
            }
            swap(v[left],v[right]);
        }
    }

复杂度

时间复杂度:O(n)

空间复杂度:O(1)

进阶:如果要求奇数与奇数、偶数与偶数之间的相对位置不变,该如何实现接口?

解法二:插入排序思想

void sort(vector<int>& v)
{
    int size = v.size();
    int k = 0;
    for (int i = 0;i < size;++k)
    {
        if ((v[i] & 1) == 1) //判断是否为奇数
        {
            int j = i;
            int tmp = v[i];
            while (k < j)
            {
                v[j] = v[j - 1];
                --j;
            }
            v[k++] = tmp;
        }
    }
}

复杂度

时间复杂度:O(n)

空间复杂度:O(1)

反转字符串中的单词

题目描述:

解法一:栈

遍历字符串,然后注意处理空格,将单词push到栈中,然后出栈即可。

class Solution {
public:
    string reverseWords(string s) {
        int size = s.size();
        string res;
        stack<string> mystack;
        for(int i = 0;i<size;++i)
        {
            if(' ' == s[i])
            {
                if(!res.empty())
                {
                    mystack.push(res);
                    res.clear();
                }
            }
            else
            res.push_back(s[i]);
        }
        while(!mystack.empty())
        {
            if(!res.empty())
            res += ' ';
            res += mystack.top();
            mystack.pop();
        }
        //处理res中最后一个' '  //这种写法很挫,因此上面对该代码做了优化,如果res不为空就给添加' '
        // size = res.size();
        // res.erase(size-1);
        return res;
    }
};

复杂度

时间复杂度:O(n)

空间复杂度:O(n)

解法二:双指针

思路图示:

string reverseWords(string s) {
        //首先反转给定字符串s
        std::reverse(s.begin(),s.end());
        int size = s.size();
        int index = 0;
        for(int i = 0;i < size;++i)
        {
            if(s[i] != ' ')
            {
                if(index != 0)
                s[index++] = ' ';
                int start = i;
                while(start < size && s[start] != ' ')
                {
                    s[index++] = s[start++];
                }
                //对每个单词进行反转
                std::reverse(s.begin()+index-(start-i), s.begin()+index);
                i = start;
            }
        }
        s.erase(index); //s.erase(s.begin()+index,s.end());删除后面的空格
        return s;
        //index相当于一个慢指针
        //start相当于一个临时快指针

复杂度

时间复杂度:O(n)

空间复杂度:O(1)

;