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

本文主要是介绍剑指offer21.调整数组顺序使得奇数位于偶数前面 57.和为s的两个数字 58.反转单词顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
暴力二次遍历(时间复杂度空间复杂度都是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;
}
};

这篇关于剑指offer21.调整数组顺序使得奇数位于偶数前面 57.和为s的两个数字 58.反转单词顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803464

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio