当前位置: 首页 > article >正文

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

目录

奇数在偶数后

解法一:双指针

复杂度

解法二:插入排序思想

复杂度

反转字符串中的单词

解法一:栈

复杂度

解法二:双指针

复杂度


奇数在偶数后

题目描述:

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

解法一:双指针

#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^2) (平均情况)

空间复杂度: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)


http://www.kler.cn/a/376176.html

相关文章:

  • (51)MATLAB迫零均衡器系统建模与性能仿真
  • 2024 IC行业还能不能入了?
  • Java项目实战II基于Java+Spring Boot+MySQL的智能推荐的卫生健康系统(开发文档+数据库+源码)
  • Go语言的使用
  • 再探“构造函数”
  • Python爬虫入门篇!
  • 仿真工具Modelsim和QuestaSim有什么区别?
  • 摄像机实时接入分析平台LiteAIServer视频智能分析软件诊断噪声检测
  • 利用Claude制作web小游戏(一):俄罗斯方块
  • 【Linux第七课--基础IO】内存级文件、重定向、缓冲区、文件系统、动态库静态库
  • JavaScript 进阶 - 第2天 (黑马笔记)
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day7
  • 必备!20道大模型面试问题详解(含答案)
  • Edge 浏览器插件开发:图片切割插件
  • 信息学科平台系统设计与实现:Spring Boot框架
  • 做等保二级备案需要准备哪些材料
  • Qt小bug —— QTableWidget排序后更新数据显示不全
  • 2024阿里云CTF Web writeup
  • Java 集合一口气讲完!(下)p\··/q
  • QNX 7.0.0开发总结
  • 【深度学习|地学应用】人工智能技术的发展历程与现状:探讨深度学习在遥感地学中的应用前景
  • 编程之路:蓝桥杯备赛指南
  • linux alsa-lib snd_pcm_open函数源码分析(三)
  • 【汽车租聘管理与推荐】Python+Django网页界面+推荐算法+管理系统网站
  • 非自适应性上下文
  • Oracle 第11章:异常处理