剑指offer21.调整数组顺序使得奇数位于偶数前面 57.和为s的两个数字 58.反转单词顺序

news2024/12/29 7:49:45

在这里插入图片描述
暴力二次遍历(时间复杂度空间复杂度都是n)

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        vector<int> result(nums.size());
        int left=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]%2==1) result[left++]=nums[i];
        }
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]%2==0) result[left++]=nums[i];
        }
        return result;
    }
};

这边有一个问题 ,就是如果这个vector result(nums.size()) 不知道长度 那插入数组时候只能用result.push_back(nums[i])
只有在我定义里这vector容器长度n的时候。我才能使用result[i]
这是不定义长度的写法

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        vector<int> result;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]%2==1) result.push_back(nums[i]);
        }
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]%2==0) result.push_back(nums[i]);
        }
        return result;
    }
};

方法2:双指针,一次遍历,原地修改
时间n 空间1

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        int left=0,right=1;
        while(right<nums.size())
        {
            if(nums[left]%2==1||nums[right]%2==1)//left和right至少有一个为奇数
            {
                if(nums[left]%2==0)//前偶后奇 调换
                {
                int temp=nums[left];
                nums[left]=nums[right];
                nums[right]=temp;
                }
                //其他情况 比如前奇后偶 前奇后奇 都不需要调换 直接++
                left++;
                right++;
            }
            else //全为偶数
            {
             right++;
            }
        }

        return nums;
    }
};

在这里插入图片描述
无语 写了个哈希集合 然后就大无语,耗时耗空间
我想的是先把当前数组放到哈希表里,然后再遍历当前数组的时候,在哈希集合里找有没有和他配对的,有就放进result里面
在这里插入图片描述

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_set<int>set;
        vector<int>result;
        for(int i=0;i<nums.size();i++) set.insert(nums[i]);
        for(int i=0;i<nums.size();i++)
        {
            if(set.count(target-nums[i])!=0)
            {
                result={nums[i],target-nums[i]};
            }
        }
        return result;
    }
};

优化哈希表(记住 这是一个排过序的 所以找到后面大的 大的对应的target-x一定是前面已经存储在哈希容器里的。(其实和没优化的差距不大哈哈哈哈)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
      unordered_set<int>set;
      for(auto x:nums)
      {
          if(set.count(target-x)!=0) return {x,target-x};
          set.insert(x);
      }
     return {};
    }
};

方法2:双指针 和三数之和很像,只是不用去重

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
      int left=0,right=nums.size()-1;
      while(left<right)
      {
          if(nums[left]+nums[right]>target) right--;
          else if(nums[left]+nums[right]==target) return{nums[left],nums[right]};
          else left++;
      }
      return {};
    }
};

在这里插入图片描述
调用stringstream

class Solution {
public:
    string reverseWords(string s) {
        string res = "",temp;
        stringstream ss(s);
        while(ss >> temp){
            res = temp + " " + res;//temp读取s里每一个单词
        }
        res.pop_back();
        return res;
    }
};

方法2:暴力解法
整体翻转+局部一个一个翻转(要求每个单词中间只能用一个空格连接)
思路 找空格 截取当前单词的0到空格 拼接直到再也找不到空格
问题:1.要去除字符串前面所有的空格 2.去除字符串整体翻转后所有的空格 3.去除字符串中间单词的空格 比如 a good example 。
举例:” a good example “
1.首先去除前面的空格->” a good example “
2.整体翻转->” elpmaxe doog a “,去除前面的空格->” elpmaxe doog a “
3.第一次找空格elpmaxe后面 截取出来翻转->“example”,substr=example,result+=example,s截取变成” doog a“去除中间的空格->”doog a“
4.第二次找空格 截取 翻转”good“,substr=good;result=example good,s变成a,此时其实是找不到空格的,那条件判定就会出现问题,因此要在大循环while (s.find(" ") != s.npos)判断前,去除首位空格后,在s尾部加一个空格,这样到第四步就变成了 s=”a “
5.第三次找空格,a后面,翻转即本身,substr=a,result=a good example s啥也解决不到了
循环结束!!!

class Solution {
public:
string reverseWords(string s) {
    string result, substr;
    int len = s.size();
    int pos = 0;
    while (s[0] == ' ')
    {
        len--;
        s = s.substr(1, len);
    }//去除前面的空格
    reverse(s.begin(), s.end());//整个字符串翻转
    int i = 0;
    while (s[0] == ' ')
    {
        len--;
        s = s.substr(1, len);
    }//去除翻转后前面的空格
    s += " ";//后面加个空格
    cout<<s<<endl;
    len++;
    int flag = 0;
    while (s.find(" ") != s.npos)
    {
        int j = 0;
        if (flag != 0) result+= " ";
        flag=1;//就是指示第一个不用加空格,下面单词拼接都要用的
        pos = s.find(" ");
        substr = s.substr(0, pos);
        reverse(substr.begin(), substr.end());
        result += substr;
        s = s.substr(pos+1 , len - pos - 1);
        len=s.size();
       while (s[0] == ' ')
       {
        len--;
        s = s.substr(1, len);
       }//去除中间的空格
    }

    return result;
}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/776774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深拷贝浅拷贝有什么区别?怎么实现深拷贝?

目录 一、浅拷贝二、深拷贝三、两者区别&#xff1f; 一、浅拷贝 浅拷贝&#xff0c;指的是创建新的数据&#xff0c;这个数据有着原始数据属性值的一份精确拷贝。 如果属性是基本类型&#xff0c;拷贝的就是基本类型的值。如果属性是引用类型&#xff0c;拷贝的就是内存地址 …

理解Vuex

Vuex是什么 专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信 Vuex Github地址 …

走向具身智能丨美格高算力AI模组 以端侧智慧连接人和家庭

“贾维斯&#xff0c;我需要你的帮助。”这是钢铁侠Tony Stark在电影中向他的人工智能助手Jarvis寻求支持的场景。《钢铁侠》中的贾维斯不仅令观众着迷&#xff0c;也点燃了人们对于智能助手的想象力。正如电影《她》中所描绘的那样&#xff0c;智能助手还可以与人类建立真实的…

dolphinscheduler伪分布式安装

1、上传安装包 2、安装 #解压 重命名 [rootdatacollection conf]# cd /opt/modules/ [rootdatacollection modules]# tar -zxf apache-dolphinscheduler-2.0.6-bin.tar.gz -C /opt/installs/ [rootdatacollection modules]# cd ../installs/ [rootdatacollection installs]# m…

这8种算法——程序员必会

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 算法一&#xff1a;快速排序法 快速排序法是对冒泡排序的一种改进&#xff0c…

Jmeter测试脚本编写详解(配详图)

一、简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数…

ORACLE数据库scott没有相关权限

1. 首先登陆具有DBA权限的用户 1.1 打开cmd 1.2 输入以下命令 sqlplus / as sysdab上述命令中的 / as sysdba 表示使用操作系统认证登录&#xff0c;同时指定DBA权限 1.3 回车执行命令&#xff0c;系统或将提示输入密码&#xff08;没有则直接跳过&#xff09; 1.4 密码正…

AndroidStudio-实现登录界面(数据存储在SQLite)

要求&#xff1a;每种错误信息采用Toast进行提示 &#xff08;1&#xff09;未注册的用户不能进行登录&#xff1b; &#xff08;2&#xff09;用户名和密码不能为空&#xff1b; &#xff08;3&#xff09;用户名不能重复&#xff1b; 一、创建新工程 点击next 修改名字 &…

JQuery 实现点击按钮添加及删除 input 框

前言 用于记录开发中常用到的&#xff0c;快捷开发 需求新增功能 比如说&#xff0c;我台设备可以设置一个或多个秘钥&#xff0c;有时候我配置一个秘钥时&#xff0c;就不需要多个输入框&#xff0c;当我想配置多个秘钥时&#xff0c;就需要添加多个输入框。 实现 HTML …

Adobe打印机另存pdf出错生成log文件,打印失败

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 用adobe打印机转pdf出错生成log文件,打印失败&#xff0c;log文件内容如下&#xff1a; %%[ ProductName: Distiller ]%% FZXBSJW--GB1-0 not found, using Courier. %%[ Error: typecheck; Offendi…

Mac安装MySQL详细教程

1、MySQL安装包下载 还没下载的话请前往官网下载 我们可以看到这里有两个不同架构的dmg的安装包&#xff0c;如果不知道自己电脑是ARM还是X86的话可以打开终端输入&#xff1a;uname -a 或者 uname -a | awk -F " " {print $(NF-1)} 来查看如下图&#xff1a; 这里显…

v-cloak和v-once和v-pre指令

v-cloak指令&#xff08;没有值&#xff09;&#xff1a; 1.本质是一个特殊属性&#xff0c;Vue实例创建完毕并接管容器后&#xff0c;会删掉v-cloak属性。 2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题 v-once: v-once指令&#xff1a; 1.v-once所在节点在初…

基于linux下的高并发服务器开发(第一章)- Linux开发环境搭建

​​​​​​基于linux下的高并发服务器开发&#xff08;第一章&#xff09;-Linux环境开发搭建1.1_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/131681333?spm1001.2014.3001.5501 解决Ubuntu 虚拟机没…

高数笔记01:函数、极限、连续

图源&#xff1a;文心一言 本文是我学习高等数学第一章的一些笔记和心得&#xff0c;主要介绍了函数、极限、连续这三个基本概念&#xff0c;以及它们的性质和很基础的计算技巧。希望可以与考研路上的小伙伴一起努力上岸~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料…

Python自动化测试之cookie绕过登录(保持登录状态)

前言 在编写接口自动化测试用例或其他脚本的过程中&#xff0c;经常会遇到需要绕过用户名/密码或验证码登录&#xff0c;去请求接口的情况&#xff0c;一是因为有时验证码会比较复杂&#xff0c;比如有些图形验证码&#xff0c;难以通过接口的方式去处理&#xff1b;再者&…

系统学习Halcon视觉软件指南

要系统学习Halcon视觉软件&#xff0c;您可以按照以下步骤进行&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 学习基本概念&#xff1a;了解Halcon的基本概念和术语&#xff0c;例如图像处理、特征提取、图像匹配等。可以查阅Halcon的官方…

Web开发的富文本编辑器CKEditor介绍,Django有库ckeditor_uploader对它进行支持,django-ckeditor安装方法及使用注意事项

当需要在网页应用程序中提供富文本编辑功能时&#xff0c;CKEditor是一个流行的选择。CKEditor是一个开源的JavaScript富文本编辑器&#xff0c;它提供了强大的功能和用户友好的界面&#xff0c;使用户可以轻松创建和编辑格式化的文本内容。 以下是CKEditor的一些主要特性&…

MySQL进阶:函数

​ 在MySQL中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;MySQL提供了很多函数。函数可以理解为别人封装好的模板代码。 一、聚合函数 ​ 在MySQL中&#xff0c;聚合函数主要由&#xff1a;count、sum、min、max、avg组成&#xff0c;这些函数前面已经提过&…

std::stox类型

std::stod 函数原型 double stod (const string& str, size_t* idx 0); double stod (const wstring& str, size_t* idx 0);函数功能 将std::string字符串转化为双精度类型 函数参数 str 待转换的字符串 idx 如果idx的指针不为空&#xff0c;则该函数会将idx的…

为什么计算ORB特征点的时候还要取圆形而不是方形像素区域呢?

ORB (Oriented FAST and Rotated BRIEF)是一种在计算机视觉中广泛应用的特征检测和描述符算法。它的设计目的是为了快速、有效地提取图像中的关键点和描述符。在ORB的过程中&#xff0c;确实会涉及到提取圆形区域的操作&#xff0c;这主要出于以下的原因&#xff1a; 旋转不变性…