剑指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 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”