当前位置:首页 > 科技  > 知识百科

调整数组元素顺序,你了解几分?

来源: 责编: 时间:2023-08-07 16:30:11 369观看
导读 前言有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。实现思路我们通过一个实例来分析下:假设有这样一个数组:[2, 4, 5, 6,

前言nUU28资讯网——每日最新资讯28at.com

有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。nUU28资讯网——每日最新资讯28at.com

实现思路nUU28资讯网——每日最新资讯28at.com

我们通过一个实例来分析下:假设有这样一个数组:[2, 4, 5, 6, 7, 8, 9, 11],将奇数移动到最前面后,就是:[11, 9, 5, 7, 6, 8, 4, 2]。nUU28资讯网——每日最新资讯28at.com

通过观察后,我们发现在扫描这个数组的时候,如果发现有偶数出现在奇数的前面, 就交换他们的顺序,交换之后就符合要求了。nUU28资讯网——每日最新资讯28at.com

因此,我们可以维护两个指针:nUU28资讯网——每日最新资讯28at.com

第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动;nUU28资讯网——每日最新资讯28at.com

在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,则交换这两个数字。nUU28资讯网——每日最新资讯28at.com

接下来,我们来通过图来描述下上述例子交换指针的过程,如下所示:nUU28资讯网——每日最新资讯28at.com

第一个指针永远指向偶数,如果不为偶数就向后移动;第二个指针永远指向奇数,如果不为奇数就向前移动;当两个指针各自指向的数都符合条件时,就交换两个元素的位置;交换完成后,重复上述步骤,直至两个指针相遇或者第一个指针位于第二个指针之后则代表问题已得到解决。nUU28资讯网——每日最新资讯28at.com

nUU28资讯网——每日最新资讯28at.com

实现代码nUU28资讯网——每日最新资讯28at.com

有了思路之后,我们来看下实现代码,如下所示:nUU28资讯网——每日最新资讯28at.com

export class AdjustArrayOrder {nUU28资讯网——每日最新资讯28at.com
// 指向数组元素的两个指针:一个指向数组头部、一个指向数组尾部nUU28资讯网——每日最新资讯28at.com
private begin = 0;nUU28资讯网——每日最新资讯28at.com
private end = 0;nUU28资讯网——每日最新资讯28at.com
nUU28资讯网——每日最新资讯28at.com
// 调整数组中奇数与偶数元素的位置:奇数位于偶数前面nUU28资讯网——每日最新资讯28at.com
reorderOddEven(arr: Array): void {nUU28资讯网——每日最新资讯28at.com
this.end = arr.length - 1;nUU28资讯网——每日最新资讯28at.com
while (this.begin < this.end) {nUU28资讯网——每日最新资讯28at.com
// 向后移动begin(转成二进制跟1做与运算,运算结果为0就表示为偶数),直至其指向偶数nUU28资讯网——每日最新资讯28at.com
while (this.begin < this.end && (arr[this.begin] & 0x1) !== 0) {nUU28资讯网——每日最新资讯28at.com
this.begin++;nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
nUU28资讯网——每日最新资讯28at.com
// 向前移动end(转成二进制跟1做与运算,运算结果为1就表示为奇数),直至其指向奇数nUU28资讯网——每日最新资讯28at.com
while (this.begin < this.end && (arr[this.end] & 0x1) === 0) {nUU28资讯网——每日最新资讯28at.com
this.end--;nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
nUU28资讯网——每日最新资讯28at.com
// begin指向了偶数,end指向了奇数nUU28资讯网——每日最新资讯28at.com
if (this.begin < this.end) {nUU28资讯网——每日最新资讯28at.com
// 交换两个元素的顺序nUU28资讯网——每日最新资讯28at.com
[arr[this.begin], arr[this.end]] = [arr[this.end], arr[this.begin]];nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
// 重置指针位置nUU28资讯网——每日最新资讯28at.com
this.begin = 0;nUU28资讯网——每日最新资讯28at.com
this.end = 0;nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
}代码的可扩展nUU28资讯网——每日最新资讯28at.com

性如果数组中的元素不按照奇前偶后排列,我们需要将其按照大小进行划分,所有负数都排在非负数的前面,应该怎么做?nUU28资讯网——每日最新资讯28at.com

聪明的开发者可能已经想到了方案:双指针的思路还是不变,我们只需修改内层while循环的的判断条件即可。nUU28资讯网——每日最新资讯28at.com

这样回答没有问题,确实解决了这个问题,那么如果再改改题目,我们需要把数组中的元素分为两部分,能被3整除的数都在不能被3整除的数前面,应该怎么做?nUU28资讯网——每日最新资讯28at.com

经过思考后,我们发现这个问题无论再怎么改变都有一个共同的部分:双指针的逻辑永远不会变。变化的只是判断条件,那么我们就可以把变化的部分提取成函数,当作参数让调用者传进来,这样就完美的解决了这个问题,也正是我们所提及的代码的可扩展性。nUU28资讯网——每日最新资讯28at.com

最后,我们来看下实现代码,如下所示:nUU28资讯网——每日最新资讯28at.com

// 元素排序nUU28资讯网——每日最新资讯28at.com
reorder(arr: Array, checkFun: (checkVal: number) => boolean): void {nUU28资讯网——每日最新资讯28at.com
this.end = arr.length - 1;nUU28资讯网——每日最新资讯28at.com
while (this.begin < this.end) {nUU28资讯网——每日最新资讯28at.com
// 向后移动beginnUU28资讯网——每日最新资讯28at.com
while (this.begin < this.end && !checkFun(arr[this.begin])) {nUU28资讯网——每日最新资讯28at.com
this.begin++;nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
nUU28资讯网——每日最新资讯28at.com
// 向前移动endnUU28资讯网——每日最新资讯28at.com
while (this.begin < this.end && checkFun(arr[this.end])) {nUU28资讯网——每日最新资讯28at.com
this.end--;nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
nUU28资讯网——每日最新资讯28at.com
// begin与end都指向了正确的位置nUU28资讯网——每日最新资讯28at.com
if (this.begin < this.end) {nUU28资讯网——每日最新资讯28at.com
// 交换两个元素的顺序nUU28资讯网——每日最新资讯28at.com
[arr[this.begin], arr[this.end]] = [arr[this.end], arr[this.begin]];nUU28资讯网——每日最新资讯28at.com
}nUU28资讯网——每日最新资讯28at.com
}测试用例nUU28资讯网——每日最新资讯28at.com

我们先来测试下奇数在偶数之前的函数处理代码能否正常执行,如下所示:nUU28资讯网——每日最新资讯28at.com

const adjustArrayOrder = new AdjustArrayOrder();nUU28资讯网——每日最新资讯28at.com
// 奇数在前nUU28资讯网——每日最新资讯28at.com
const arr = [2, 4, 5, 6, 7, 8, 9, 11];nUU28资讯网——每日最新资讯28at.com
adjustArrayOrder.reorderOddEven(arr);nUU28资讯网——每日最新资讯28at.com
console.log(arr);nUU28资讯网——每日最新资讯28at.com

执行结果如下所示:nUU28资讯网——每日最新资讯28at.com

nUU28资讯网——每日最新资讯28at.com

最后,我们来测试下reorder函数能否正常执行:nUU28资讯网——每日最新资讯28at.com

负数在数组的最前面// 负数在前nUU28资讯网——每日最新资讯28at.com
const checkMinusNumber = function (val: number) {nUU28资讯网——每日最新资讯28at.com
return val > 0;nUU28资讯网——每日最新资讯28at.com
};nUU28资讯网——每日最新资讯28at.com
const arr = [2, 4, 5, 6, 7, -8, -10 - 12, -2];nUU28资讯网——每日最新资讯28at.com
adjustArrayOrder.reorder(arr, checkMinusNumber);nUU28资讯网——每日最新资讯28at.com
console.log(arr);nUU28资讯网——每日最新资讯28at.com

nUU28资讯网——每日最新资讯28at.com

能被3整除的数在数组的最前面const checkDivisible = function (val: number) {nUU28资讯网——每日最新资讯28at.com
return val % 3 !== 0;nUU28资讯网——每日最新资讯28at.com
};nUU28资讯网——每日最新资讯28at.com
const arr = [2, 4, 5, 6, 3, 6, 9, 12];nUU28资讯网——每日最新资讯28at.com
adjustArrayOrder.reorder(arr, checkDivisible);nUU28资讯网——每日最新资讯28at.com
console.log(arr);nUU28资讯网——每日最新资讯28at.com

nUU28资讯网——每日最新资讯28at.com

示例代码nUU28资讯网——每日最新资讯28at.com

文中所举代码的完整版请移步:nUU28资讯网——每日最新资讯28at.com

AdjustArrayOrder.ts[1]adjustArrayOrder-test.ts[2]参考资料nUU28资讯网——每日最新资讯28at.com

[1]AdjustArrayOrder.ts: https://github.com/likaia/algorithm-practice/blob/e7f6a38021426397af60a73d4c6b8bf88548ba91/src/AdjustArrayOrder.ts#L2nUU28资讯网——每日最新资讯28at.com

[2]adjustArrayOrder-test.ts: https://github.com/likaia/algorithm-practice/blob/e7f6a38021426397af60a73d4c6b8bf88548ba91/src/test-case/adjustArrayOrder-test.ts#L3nUU28资讯网——每日最新资讯28at.com

[3]个人网站: https://www.kaisir.cn/nUU28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-119-2283-0.html调整数组元素顺序,你了解几分?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 数据分析和数据科学的五大不同之处 译文

下一篇: 亚马逊云计算主管:AWS将保持云服务领先地位 不打算将其分拆

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top