您现在的位置是:热点 >>正文
调整数组元素顺序,你了解几分?
热点275人已围观
简介...
前言
有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。
实现思路
我们通过一个实例来分析下:假设有这样一个数组:[2, 4, 5, 6, 7, 8, 9, 11],将奇数移动到最前面后,就是:[11, 9, 5, 7, 6, 8, 4, 2]。
通过观察后,我们发现在扫描这个数组的时候,如果发现有偶数出现在奇数的前面, 就交换他们的顺序,交换之后就符合要求了。
因此,我们可以维护两个指针:
第调整一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动;
在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,则交换这两个数字。
接下来,我们来通过图来描述下上述例子交换指针的过程,如下所示:
第一个指针永远指向偶数,如果不为偶数就向后移动;第二个指针永远指向奇数,如果不为奇数就向前移动;当两个指针数组各自指向的数都符合条件时,就交换两个元素的位置;交换完成后,重复上述步骤,直至两个指针相遇或者第一个指针位于第二个指针之后则代表问题已得到解决。
实现代码
有了思路之后,我们来看下实现代码,如下所示:
export class AdjustArrayOrder {
// 指向数组元素的两个指针:一个指向数组头部、一个指向数组尾部
private begin = 0;
private end = 0;
// 调整数组中奇数与偶数元素元素的位置:奇数位于偶数前面
reorderOddEven(arr: Array): void {
this.end = arr.length - 1;
while (this.begin < this.end) {
// 向后移动begin(转成二进制跟1做与运算,运算结果为0就表示为偶数),直至其指向偶数
while (this.begin < this.end && (arr[this.begin顺序] & 0x1) !== 0) {
this.begin++;
}
// 向前移动end(转成二进制跟1做与运算,运算结果为1就表示为奇数),直至其指向奇数
while (this.begin < this.end && (arr[this.end] & 0x1) === 0) {
this.end--;
}
// begin指向了偶数,end指向了奇数
if (this.begin < this.en,你d) {
// 交换两个元素的顺序
[arr[this.begin], arr[this.end]] = [arr[this.end], arr[this.begin]];
}
}
// 重置指针位置
this.begin = 0;
this.end = 0;
}
}代码的可扩展
性如果数组中的元素不按照奇前偶后排列,我们需要将其按照大小进行划分,所有负数都排在非负数的前面,应该怎么做?
聪明的开发者可能已经想到了方案:双指针的思路还是了解不变,我们只需修改内层while循环的的判断条件即可。
这样回答没有问题,确实解决了这个问题,那么如果再改改题目,我们需要把数组中的元素分为两部分,能被3整除的数都在不能被3整除的数前面,应该怎么做?
经过思考后,我们发现这个问题无论再怎么改变都有一个共同的部分:双指针的逻辑永远不会变。变化的只是判断条件,那么我们就可以把变化的部分提取成函数,当作参数让调用者传进来,这样就完美的解决了这个问题,也正是我们所几分提及的代码的可扩展性。
最后,我们来看下实现代码,如下所示:
// 元素排序
reorder(arr: Array, checkFun: (checkVal: number) => boolean): void {
this.end = arr.length - 1;
while (this.begin < this.end) {
// 向后移动begin
while (this.begin < this.end &&am调整p; !checkFun(arr[this.begin])) {
this.begin++;
}
// 向前移动end
while (this.begin < this.end && checkFun(arr[this.end])) {
this.end--;
}
// begin与end都指向了正确的位置
if (this.begin < this.end) {
// 交换两个元素的顺序
[arr数组[this.begin], arr[this.end]] = [arr[this.end], arr[this.begin]];
}
}测试用例
我们先来测试下奇数在偶数之前的函数处理代码能否正常执行,如下所示:
const adjustArrayOrder = new AdjustArrayOrder();
// 奇数在前
const arr = [2, 4, 5, 6, 7, 8, 9, 11];
adjustArrayOrder.reorderO元素ddEven(arr);
console.log(arr);
执行结果如下所示:
最后,我们来测试下reorder函数能否正常执行:
负数在数组的最前面// 负数在前
const checkMinusNumber = function (val: number) {
return val > 0;
};
const arr = [2, 4, 5, 6, 7, -8, -10 - 12, -2];
adjustArrayOrder.reorder(ar顺序r, checkMinusNumber);
console.log(arr);
能被3整除的数在数组的最前面const checkDivisible = function (val: number) {
return val % 3 !== 0;
};
const arr = [2, 4, 5, 6, 3, 6, 9, 12];
adjustArrayOrder.reorder(arr, checkDivisible);
console.log(arr,你);
示例代码
文中所举代码的完整版请移步:
AdjustArrayOrder.ts[1]adjustArrayOrder-test.ts[2]参考资料
[1]AdjustArrayOrder.ts: https://github.com/likaia/algorithm-practice/blob/e7f6a38021426397af60a73d4c6b8bf88548ba91/src/AdjustArrayOrder了解.ts#L2
[2]adjustArrayOrder-test.ts: https://github.com/likaia/algorithm-practice/blob/e7f6a38021426397af60a73d4c6b8bf88548ba91/src/test-case/adjustArrayOrder-test.ts#L3
[3]个人网站: https://www.kaisir.cn/
Tags:
相关文章
标签: 德适 医学影像AI 港交所 杭州
热点云梦级3月30日云梦级消息,今日,德适正式登陆港交所,股票定价每股99港元,开盘股价大涨121%,达到219港元。 目前,德适的产品与服务已覆盖全国31个省的 400 多家医疗机构。财务数据显示,20...
【热点】
阅读更多平台不得大数据杀熟!《网络交易平台规则监督管理办法》发布
热点1月7日消息,市场监管总局和国家网信办联合发布《网络交易平台规则监督管理办法》,旨在规范网络交易平台规则制定、修改和执行,维护网络交易秩序,保护网络交易各方主体合法权益。 《办法》聚焦网络交易平台经营...
【热点】
阅读更多标签: Snapchat AI 裁员
热点云梦级4月15日云梦级消息,Snapchat 母公司 Snap 美国当地时间今日宣布一系列人事变动,在整个公司的范围内裁撤约 1000 个岗位,这影响约 16% 全职员工。该企业还同步宣布将关闭 30...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.pearson.com/en-us/search.html?aq=百度快排【tg:seogoogle987】,OFb
- https://www.pickett.co.uk/collections/vendors?q=百度快排【tg:seogoogle987】,tlM
- https://www.jusoen.com/addreng.asp?p1=百度快排【tg:seogoogle987】BQM
- https://www.signingsavvy.com/sentence/百度快排【tg:seogoogle987】,N6v
- https://www.teamlab.art/zh-hans/?submit=百度快排【tg:seogoogle987】,x1s
- https://www.tombow.com/search/百度快排【tg:seogoogle987】,ECz
- https://www.manga-news.com/index.php/recherche/?q=百度快排【tg:seogoogle987】,DcK
- https://www.sogou.com/web?query=百度快排【tg:seogoogle987】,pSh
- https://www.remit.co.jp/id/?s=百度快排【tg:seogoogle987】,aRx
- https://www.selfsufficientish.com/main/?s=百度快排【tg:seogoogle987】,kvp
- https://www.zutari.com/search/百度快排【tg:seogoogle987】,H2i
- https://www.polliwogs.com/search/百度快排【tg:seogoogle987】,OfE
- https://zhidao.baidu.com/index/?action=QUERY&word=百度快排【tg:seogoogle987】,Pgo
- https://www.roberthalf.com/us/en/jobs/all/百度快排【tg:seogoogle987】wOP
- https://www.wattpad.com/search/百度快排【tg:seogoogle987】7ql
- https://www.dba.dk/soeg/?soeg=百度快排【tg:seogoogle987】or8
- https://www.televes.com/es/catalogsearch/result/?q=百度快排【tg:seogoogle987】,R2U
- https://www.lssystems.co.uk/search?page=0&per_page=24&term=百度快排【tg:seogoogle987】,4dl
- https://wydden.com/?ID=r8w9WMSKWkOcmiaFWaUv0dzMdqZWfKtF&s=百度快排【tg:seogoogle987】,Krc
- https://www.wellbees.com/catalogsearch/result/?action=CHECK&q=百度快排【tg:seogoogle987】,K7e
- https://www.shopping.com/search.html?keyword=百度快排【tg:seogoogle987】,vlX
- https://www.totolink.vn/search/百度快排【tg:seogoogle987】,ecK
- https://www.sic-info.org/en/?s=百度快排【tg:seogoogle987】,QaV
- https://www.uctronics.com/catalogsearch/result/?q=百度快排【tg:seogoogle987】,S8Y
- https://www.schenckprocess.com/search?q=百度快排【tg:seogoogle987】,KQu
- https://blvdseafood.com/?s=百度快排【tg:seogoogle987】y8x
- https://www.ons.gov.uk/search?q=百度快排【tg:seogoogle987】,SMg
- https://www.seforall.org/search?keywords=百度快排【tg:seogoogle987】,l48
- https://www.teacherspayteachers.com/Browse/Search:百度快排【tg:seogoogle987】,YEZ
- https://www.pierreherme.com/catalogsearch/result/?q=百度快排【tg:seogoogle987】,s8Z
- https://dict.naver.com/dict.search?dicQuery&query=百度快排【tg:seogoogle987】0CP
- https://www.yidian51.com/taobao/百度快排【tg:seogoogle987】,clY
- https://www.remit.co.jp/ne/?s=百度快排【tg:seogoogle987】,IBC
- https://www.vet-direct.com/search?cat=72&term=百度快排【tg:seogoogle987】,HCm
- https://www.rostaing.com/catalogsearch/result/?cat=22&q=百度快排【tg:seogoogle987】,wga
- https://www.revere.org/search?action=SEARCH&q=百度快排【tg:seogoogle987】,9r0
- https://www.remit.co.jp/pt/?action=CHECK&s=百度快排【tg:seogoogle987】,KbZ
- https://m.shoppinghow.kakao.com/m/search/q/百度快排【tg:seogoogle987】WWv
- https://www.yr.no/en/search?q=百度快排【tg:seogoogle987】,Pn4
- https://www.kaiyueleather.com/search/百度快排【tg:seogoogle987】,30x
- https://www.pinkpanda.ro/magazin/ingrijirea-tenului?page=87&q=百度快排【tg:seogoogle987】,vdT
- https://www.tiktok.com/tag/百度快排【tg:seogoogle987】,agg
- https://nicolazzi.it/en/?s=百度快排【tg:seogoogle987】,Idd
- https://www.hanbat.ac.kr/search/front/Search.jsp?qt=百度快排【tg:seogoogle987】x20
- https://www.miamiopenmri.com/?action=CHECK&s=百度快排【tg:seogoogle987】,0qv
- https://www.universal-music.co.jp/?ID=1sIcckCTeBS8FjzCshAW9w53s8gr691o&s=百度快排【tg:seogoogle987】,YIQ
- https://www.voices.com/talents/search?keywords=百度快排【tg:seogoogle987】,98r
- https://www.monroecounty.gov/search/?q=百度快排【tg:seogoogle987】,VWK
- https://www.parl.ca/legisinfo/fr/projets-de-loi?parlsession=all&view=list&keywords=百度快排【tg:seogoogle987】,mlU
- https://www.swecobelgium.be/?page=9&s=百度快排【tg:seogoogle987】,EWz