LeetCode 算法

本文参照 LeetCode题解 里面的例子都是用c/c++实现的,为了学习算法,将里面的实现方式改为JavaScript【如果有侵权请联系我】

数组类的算法

Remove Element

作为开胃菜,我当然选取了最容易的一道题目,在一个数组里面移除指定value,并且返回新的数组长度。这题唯一需要注意的地方在于in place,不能新建另一个数组。
方法很简单,使用两个游标i,j,遍历数组,如果碰到了value,使用j记录位置,同时递增i,直到下一个非value出现,将此时i对应的值复制到j的位置上,增加j,重复上述过程直到遍历结束。这时候j就是新的数组长度。

function removeEle (ary, ele) {
    for(let i = 0; i < ary.length; i++) {
        if(ary[i] === ele){
            ary.splice(i, 1); // 注意数组删除后会有数组塌陷的问题
            i--;
        }
    }
    return ary;
}

Remove Duplicates from Sorted Array

这道题目与前一题Remove Element比较类似。但是在一个排序好的数组里面删除重复的元素。

/**
 * 在一个排序好的数组里面删除重复的元素
 * @param ary
 */
function filterAry(ary) {
  const counter = {};
  for (let i = 0; i < ary.length; i++) {
    if (counter[ary[i]]) {
      ary.splice(i, 1);
      i--; // 注意数组塌陷;
    } else {
      counter[ary[i]] = true;
    }
  }
  return ary;
}

Remove Duplicates from Sorted Array II

同样是移除重复的元素,但是可以允许最多两次重复元素存在
这里我们可以稍微把上面那个方法扩展下

/**
 * 在一个排序好的数组里面删除重复的元素
 * @param ary
 * @param repeatCount
 */
function filterAry(ary, repeatCount) {
  const counter = {};
  for (let i = 0; i < ary.length; i++) {
    if (counter[ary[i]]) {
      counter[ary[i]] += 1;
      if(counter[ary[i]] > repeatCount){
        ary.splice(i, 1);
        i--; // 注意数组塌陷;
      }
    } else {
      counter[ary[i]] = 1;
    }
  }
  return ary;
}

push One

将一个数字的每个位上的数字分别存到一个一维数组中,最高位在最开头,我们需要给这个数字加一,即在末尾数字加一,如果末尾数字是9,那么则会有进位问题,而如果前面位上的数字仍为9,则需要继续向前进位

function pushOne(ary) {
  const aryLength = ary.length;

  for (let i = aryLength - 1; i > -1; i--) {
    if (ary[i] === 9) {
      ary[i] = 0;
      continue;
    }
    ary[i] += 1;
    return ary;
  }
  ary.unshift(1);
  return ary;
}

我们稍微在上一题的基础上扩展下,进位为指定的,比如 有一个数组
[1,2,3,4] 我们指定进位为2 然后第一项为最高位,
4 进1 变成 5 进位为2 5%2 = 2…1 那么4变成了1 向前进2
3 进 2 变成 5 同上 变为 1

处理完以后应该为 [1,1,0,1,1]

function pushOne(ary, carryFlag) {
  const aryLength = ary.length;
  let addCount = 1; // 初始为1
  for (let i = aryLength - 1; i > -1; i--) {
    const result = ary[i] + addCount;
    if(result < carryFlag){
      ary[i] = result;
      return ary;
    }

    ary[i] = result % carryFlag;
    addCount = Math.floor(result /carryFlag);
  }
  while (addCount){
    ary.unshift(addCount % carryFlag);
    addCount = Math.floor(addCount / carryFlag);
  }

  return ary;
}

Merge And Sort

/*
 * Given two sorted integer arrays A and B, merge B into A as one sorted array.

 Note: You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m and n respectively.

 给你两个整数数组, A, B 合并并排序
 使用JS 的concat加sort 代码是最简洁的
 * */

function mergeAndSort(aryA, aryB) {
  let a = aryA.length;
  let b = aryB.length;
  const maxLength = a + b;

  for (let i = maxLength - 1; i >= 0; i--) {
    if (aryA[a - 1] < aryB[b - 1]) {
      aryA[i] = aryB[b - 1];
      b -= 1;
    } else {
      aryA[i] = aryA[a - 1];
      a -= 1;
    }
  }
  return aryA;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值