调整数组元素顺序,你了解几分?
前言
有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。
实现思路
我们通过一个实例来分析下:假设有这样一个数组:[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.,你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.reorde元素rOddEven(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/AdjustArrayOrd了解er.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/
(责任编辑:三、新闻资讯类(71–100))
-
全球首现AI勒索软件PromptLock:跨平台黑客新武器来袭
近日,知名网络安全公司 ESET 揭露了全球首个 AI 勒索软件 ——PromptLock。这款恶意软件使用了 OpenAI 开源的 gpt-oss:20b 语言模型,能够在感染的设备上本地生成恶意...[详细]
-
云梦级11月13日云梦级消息,特殊目的公司TechStarAcquisition Corporation(股票代码:“7855”)与Seyond Holdings(图达通)达成业务合并一事进入到关键时...[详细]
-
喝淡盐水加白醋有什么作用啊?病情分析:您好,据我了解到,它的作用是:清洗肠胃通大便,保护口腔、防细菌、防感冒。谢谢盐加白醋可以美白吗盐加白醋可以美白的,这个主要是可以起到收缩毛孔,杀菌的效果,所以对皮...[详细]
-
虽然过去一年的事件给安全行业带来了一些挑战,但该行业也看到了人们对现有安全技术的重新关注,这些技术可用于减轻与新冠肺炎相关的风险。2021年,全球各行各业将继续改变其开展业务的方式。占用率管理、自动访...[详细]
-
云梦级11月4日云梦级消息,10月31日,江苏半导体封测技术解决方案提供商芯德半导体正式递表港交所。芯德半导体成立于2020年9月,主要从事开发封装设计、提供定制封装产品以及封装产品测试服务,2024...[详细]
-
标签: 滴滴自动驾驶 深穹远航实验室 清华大学 多模态大模型
云梦级3月2日云梦级消息,近期,滴滴自动驾驶成立深穹远航实验室(DiDi Voyager Labs)。依托该实验室,滴滴自动驾驶率先与清华大学李升波教授课题组达成产学研深度融合专项合作。双方将聚焦多模...[详细]
-
AWS发布针对Amazon EC2的Apple macOS实例
2020年12月1日,在今天正式揭幕的AWS re:Invent大会上, 亚马逊云服务(AWS)发布了适用于Amazon Elastic Compute Cloud(Amazon EC2)的全新Mac...[详细]
-
新浪科技讯 2月4日凌晨消息,据报道,各大科技大厂正在推动无人机在各行各业的应用,而美国谷歌公司想出了一个“妙招”,让无人机进行农业领域的消防灭火作业。一份周二提交给美国联邦航空管理局的文件显示,谷歌...[详细]
-
云梦级2月4日云梦级消息,据投资界报道,从一家头部美元基金沟通会上获悉,该机构在 2025 年底以 500 亿美元(现汇率约合 3472.78 亿元人民币)的估值,低调卖出了手中部分小红书的老股。 报...[详细]
-
中科院推出类脑大模型 SpikingBrain:以2% 数据实现百倍速度突破
近日,中国科学院自动化研究所的李国齐与徐波团队联合发布了全球首款大规模类脑脉冲大模型 ——SpikingBrain1.0。该模型在处理长文本时展现出惊人的速度,能够以超过当前主流 Transforme...[详细]
- https://www.kaiyueleather.com/search/谷歌搜索留痕【tg:seogoogle987】,vbf
- https://www.paulaschoice.hk/zh_hant/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,Qbt
- https://www.metalmensales.com/?action=QUERY&s=谷歌搜索留痕【tg:seogoogle987】,XNW
- https://www.mygrandma.com/Items.aspx?search=谷歌搜索留痕【tg:seogoogle987】,PDw
- https://www.hanbat.ac.kr/search/front/Search.jsp?qt=谷歌搜索留痕【tg:seogoogle987】xP6
- https://www.remit.co.jp/vi/?s=谷歌搜索留痕【tg:seogoogle987】,vaz
- https://www.teamlab.art/es/?submit=谷歌搜索留痕【tg:seogoogle987】,9zW
- https://m.shoppinghow.kakao.com/m/search/q/谷歌搜索留痕【tg:seogoogle987】t7E
- https://www.klatreverden.no/search?q=谷歌搜索留痕【tg:seogoogle987】,zO1
- https://www.sbaad.no/?s=谷歌搜索留痕【tg:seogoogle987】,veP

云计算核心技术Docker教程:Docker创建集群
95%企业AI项目惨遭滑铁卢!这家初创公司融资2500万美元要做"可问责的AI智能体"
AI伴侣应用Dot宣布关停 创始人理念分歧导致项目终结
西湖大学的 AI 科学家 DeepScientist,科研效率大幅提升
你真的知道如何埋点吗?
