您现在的位置是:热点 >>正文
调整数组元素顺序,你了解几分?
热点2505746人已围观
简介...
前言
有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。
实现思路
我们通过一个实例来分析下:假设有这样一个数组:[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 < thi,你s.end) {
// 交换两个元素的顺序
[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.reorderOd元素dEven(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(arr, c顺序heckMinusNumber);
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:
相关文章
字节跳动推出 USO 模型,打破 AI 图像生成的 “风格与主题” 对立
热点在 AI 图像生成领域,风格驱动和主题驱动的图像生成一直以来被视为两个相对独立的任务。前者注重风格的相似性,而后者则强调主题的一致性,造成了两者之间的矛盾。最近,字节跳动的智能创作实验室(UXO Te...
【热点】
阅读更多标签: 吉利汽车 极氪 零跑汽车 小米汽车
热点云梦级1月8日云梦级消息,据财联社报道,近日,多家车企相继披露的2026年销量目标。据悉,吉利汽车将今年的目标定在了345万辆,增长率14%,成为目前已披露2026年销量目标的车企中,销量目标最高的车...
【热点】
阅读更多云安全日报210301:IBM可视化处理平台发现执行任意代码漏洞,需要尽快升级
热点IBM StoredIQ是美国IBM公司的一套数据可视化处理平台。该平台提供了非结构化数据的可扩展分析和治理功能,并对数据进行记录管理、存储优化和迁移等。IBM StoredIQ for Legal进...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.paxnet.co.kr/search/jongmok?kwd=黑帽seo寄生虫程序【tg:seogoogle987】Ftk
- https://www.metaltix.com/?view=tours&filter=search&q=黑帽seo寄生虫程序【tg:seogoogle987】,4Ls
- https://www.smarty.net/search?q=黑帽seo寄生虫程序【tg:seogoogle987】,KMz
- https://www.sbaad.no/?s=黑帽seo寄生虫程序【tg:seogoogle987】,E4M
- https://www.l-and-b.jp/?page=1&s=黑帽seo寄生虫程序【tg:seogoogle987】,8sn
- https://www.sensorshop24.de/catalogsearch/result/index/?type=132&q=黑帽seo寄生虫程序【tg:seogoogle987】,2Fp
- https://www.kaiyueleather.com/search/黑帽seo寄生虫程序【tg:seogoogle987】,NAe
- https://www.spicebar.de/catalogsearch/result/?q=黑帽seo寄生虫程序【tg:seogoogle987】,3Xf
- https://www.tcv.org.uk/search/黑帽seo寄生虫程序【tg:seogoogle987】,N0O
- https://www.ushmm.org/search/results.php?q=黑帽seo寄生虫程序【tg:seogoogle987】,iBF
- https://www.safetv.go.kr/base/search/view?searchWord=黑帽seo寄生虫程序【tg:seogoogle987】gUi
- https://www.reallywildbirdfood.co.uk/store/search?q=黑帽seo寄生虫程序【tg:seogoogle987】,qMY
- https://www.usslexington.com/?action=QUERY&s=黑帽seo寄生虫程序【tg:seogoogle987】,gyA
- https://dict.naver.com/dict.search?dicQuery&query=黑帽seo寄生虫程序【tg:seogoogle987】vOv
- https://www.ons.gov.uk/search?q=黑帽seo寄生虫程序【tg:seogoogle987】,2Gd
- https://www.thealexandrian.net/?s=黑帽seo寄生虫程序【tg:seogoogle987】,lYm
- https://www.totolink.vn/search/黑帽seo寄生虫程序【tg:seogoogle987】,iXj
- https://www.pinkpanda.ro/magazin/ingrijirea-tenului?page=87&q=黑帽seo寄生虫程序【tg:seogoogle987】,Iha
- https://www.mynextmove.org/find/search?s=黑帽seo寄生虫程序【tg:seogoogle987】,hdi
- https://www.lssystems.co.uk/search?page=0&per_page=24&term=黑帽seo寄生虫程序【tg:seogoogle987】,857
- https://www.nyif.com/catalogsearch/result/?q=黑帽seo寄生虫程序【tg:seogoogle987】,M23
- https://www.remit.co.jp/en/?s=黑帽seo寄生虫程序【tg:seogoogle987】,CTM
- https://www.military-history.org/?s=黑帽seo寄生虫程序【tg:seogoogle987】,sjv
- https://yscc1986.net/search/黑帽seo寄生虫程序【tg:seogoogle987】KwH
- https://www.vietnamconsulate-sf.org/?action=CHECK&s=黑帽seo寄生虫程序【tg:seogoogle987】,Do1
- https://www.spoiledsweetboutique.com/search/黑帽seo寄生虫程序【tg:seogoogle987】,2OQ
- https://www.teacherspayteachers.com/Browse/Price-Range/Free/Search:黑帽seo寄生虫程序【tg:seogoogle987】,QPj
- https://www.rhymezone.com/r/rhyme.cgi?typeofrhyme=oldrel&loc=nojs&Word=黑帽seo寄生虫程序【tg:seogoogle987】,K98
- https://www.youthforum.org/search-results?cx=4f5236218ab5e8ef9&ie=UTF-8&q=黑帽seo寄生虫程序【tg:seogoogle987】,ANJ
- https://www.zutari.com/search/黑帽seo寄生虫程序【tg:seogoogle987】,Ezb
- https://www.openspaceinstitute.org/search?q=黑帽seo寄生虫程序【tg:seogoogle987】,BwR
- https://www.teamlab.art/pt/?submit=黑帽seo寄生虫程序【tg:seogoogle987】,RVV
- https://www.uckfieldtc.gov.uk/?s=黑帽seo寄生虫程序【tg:seogoogle987】,MZS
- https://www.lenovo.com/gb/en/search?action=SEARCH&text=黑帽seo寄生虫程序【tg:seogoogle987】,nKn
- https://www.teacherspayteachers.com/Browse/Search:黑帽seo寄生虫程序【tg:seogoogle987】,Qo3
- https://www.sbaad.no/search/黑帽seo寄生虫程序【tg:seogoogle987】,inj
- https://www.shopping.com/search.html?keyword=黑帽seo寄生虫程序【tg:seogoogle987】,IFJ
- https://www.maigoo.com/search/?block=&q=黑帽seo寄生虫程序【tg:seogoogle987】,MhY
- https://www.signingsavvy.com/sentence/黑帽seo寄生虫程序【tg:seogoogle987】,Eqs
- https://www.wilsonart.com/catalogsearch/result/?action=CHECK&q=黑帽seo寄生虫程序【tg:seogoogle987】,j03
- https://www.symatoys.com/search.html?ID=UyMD6aO58bPrJvQAB1I0N69KzJBZeNPC&keyword=黑帽seo寄生虫程序【tg:seogoogle987】,nqG
- https://www.temu.com/search_result.html?search_key=黑帽seo寄生虫程序【tg:seogoogle987】gfv
- https://www.polar-tech.com/?action=QUERY&s=黑帽seo寄生虫程序【tg:seogoogle987】,P6L
- https://www.nss.nhs.scot/search?q=黑帽seo寄生虫程序【tg:seogoogle987】,9P0
- https://www.vfw.org/search-results?q=黑帽seo寄生虫程序【tg:seogoogle987】,3cS
- https://www.duksung.ac.kr/search/front/Search.jsp?qt=黑帽seo寄生虫程序【tg:seogoogle987】lMM
- https://www.manga-news.com/index.php/recherche/?q=黑帽seo寄生虫程序【tg:seogoogle987】,Fge
- https://www.polliwogs.com/search/黑帽seo寄生虫程序【tg:seogoogle987】,qud
- https://www.laoairlines.com/?action=QUERY&s=黑帽seo寄生虫程序【tg:seogoogle987】,dX2
- https://www.wmfe.org/?s=黑帽seo寄生虫程序【tg:seogoogle987】,ASL