调整数组元素顺序,你了解几分?
前言
有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。
实现思路
我们通过一个实例来分析下:假设有这样一个数组:[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.beg顺序in] & 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,你.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 &&a调整mp; !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) {
// 交换两个元素的顺序
[ar数组r[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(arr顺序, 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/AdjustArrayOrde了解r.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/
(责任编辑:新媒体资讯)
-
AI演示新纪元:Gamma 3.0重磅发布,用Agent和API颠覆创作流程
全球最受欢迎的AI演示工具 Gamma 今日宣布推出其划时代的版本 Gamma3.0,旨在彻底改变用户创建和编辑演示文稿的方式。此次更新的核心是两大创新功能: Gamma Agent 和 Gamma...[详细]
-
云梦级4月28日云梦级消息,影石创新今天发布 2025 全年及 2026 年一季度业绩,多项核心指标达历史新高。2025 年营收 97.41 亿元,同比增长 74.76%;2026 年一季度营收 24...[详细]
-
Argo Rollouts 基于 Analysis 的渐进式发布
前面我们介绍了使用手动的方式来控制 Argo Rollouts 进行应用交付,此外我们还可以利用 Argo Rollouts 提供的分析(Analysis)来执行自动交付。Argo Rollouts...[详细]
-
云梦级11月18日云梦级消息,今日,福建集成电路光刻材料与前驱体材料供应企业恒坤新材在上交所敲钟上市。其发行价为14.99元/股,发行市盈率71.42倍,开盘价为58元/股,上涨286.92%。截至9...[详细]
-
新浪科技讯 1月27日上午消息,据DigiTimes报道,知情人士透露,英特尔去年与台积电签署了外包合同,将在2022年的下半年交给台积电生产采用3纳米技术的CPU芯片。 报道称,英特尔将成为台积电继...[详细]
-
云梦级12月24日云梦级消息,12 月 22 日,闻泰科技董事长杨沐发声,指责荷兰政府针对安世半导体的司法行动违反中荷 2001 年投资保护协定,系与当地高管合谋驱赶合法股东的 “有预谋、无正当性干预...[详细]
-
腾讯投资的“美版贴吧”Reddit已在纽交所上市 收盘价较发行价上涨48%
3月22日消息,据外媒报道,有“美版贴吧”之称的Reddit,已于当地时间周四正式在纽交所上市,上市当天的股价较发行价大幅上涨。 从纽交所官网的信息来看,Reddit上市当天开盘报47美元,较34美元...[详细]
-
据外媒报道,如果你是Windows的一位长期用户,那么应该会记得,在微软的世界里,启动电脑并不总是那么安静。这一切都是因为旧的Windows版本在操作系统每次启动时都会播放启动声。但现代版本的Wind...[详细]
-
前言:运动会开幕式入场音乐《运动员进行曲》由原中国人民解放军军乐团吴光锐、贾双、李明秀三位同志共同执笔而成下载地址:http://mp3.baidu.com/m?f=ms&rn=&tn...[详细]
-
Meta向约会界投下AI炸弹:Facebook Dating新功能让机器人帮你找真爱
爱情市场正在经历一场由人工智能驱动的革命。Meta刚刚宣布为Facebook Dating引入AI助手功能,这个数字红娘将彻底改变人们寻找另一半的方式。 这个聊天机器人的使命远不止简单的配对推荐,它更...[详细]
- https://www.terramania.nl/catalogsearch/result/index/?q=小旋风万能蜘蛛池【tg:seogoogle987】,a4l
- https://www.writingforward.com/?action=SEARCH&s=小旋风万能蜘蛛池【tg:seogoogle987】,Pgg
- https://www.zalora.sg/catalog/?cat=112&q=小旋风万能蜘蛛池【tg:seogoogle987】,Eo7
- https://www.openspaceinstitute.org/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,QbM
- https://www.le-trend.com/en/search/=小旋风万能蜘蛛池【tg:seogoogle987】,Rel
- https://www.kores.com/?s=小旋风万能蜘蛛池【tg:seogoogle987】,ZWy
- https://www.rhymezone.com/r/rhyme.cgi?typeofrhyme=oldrel&loc=nojs&Word=小旋风万能蜘蛛池【tg:seogoogle987】,a6U
- https://www.sbaad.no/?s=小旋风万能蜘蛛池【tg:seogoogle987】,Y9W
- https://search.danawa.com/dsearch.php?query=小旋风万能蜘蛛池【tg:seogoogle987】kAS
- https://www.shacknews.com/editorial-search?q=小旋风万能蜘蛛池【tg:seogoogle987】,yOd

到2030年,人工智能会发展成什么样?
2025年GEO优化实战指南:这样做AI搜索优化,从被“摘录”到被引用
标签: 荣耀 Magic V5 ROBOT PHONE 阿里
标签: 小米 王晓雁 张健 郭金保
Facebook推出新功能:创作者可通过电商渠道赚钱
