设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 云计算 > 正文

调整数组元素顺序 你明白几分

发布时间:2022-06-30 13:24 所属栏目:124 来源:互联网
导读:有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。 实现代码 有了思路之后,我们来看下实现代码,如下所示: export class AdjustArrayOrder { // 指向数组元素的两个指针:一个指向数组头部、一个指
  有一个整数数组,我们想按照特定规则对数组中的元素进行排序,比如:数组中的所有奇数位于数组的前半部分。
  
  实现代码
 
  有了思路之后,我们来看下实现代码,如下所示:
 
  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整除的数前面,应该怎么做?
 
  经过思考后,我们发现这个问题无论再怎么改变都有一个共同的部分:双指针的逻辑永远不会变。变化的只是判断条件,那么我们就可以把变化的部分提取成函数,当作参数让调用者传进来,这样就完美的解决了这个问题,也正是我们所提及的代码的可扩展性。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读