ARTS 打卡第 9 周

202 阅读3分钟

1、Algorithm 一道算法题

删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。

返回 k 。

初始看这道题时,想到应该用双指针方法来实现。慢指针始终指向不重复的最后一个元素,而快指针向前走找到下一个不重复的元素。对于不重复元素的判断,自然会想到用 Set 数据结构来保存。

但是,题目提到这是一个有序的数组,因此其实我们并不需要保存已经遍历过的元素,有序的元素在数组中的下标一定是连续的,那么只要一个元素不等于它的上一个元素,那么它就不是一个重复的元素。

实现方法如下:

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {    
    const len = nums.length;

    if([0,1].includes(len)){
        return len;
    }

    let fast =1,slow=1;

    while(fast < len){
        // 由于数组是有序的,因此值相等的元素,其数组下标也是连续的。
        // 只要一个元素不等于它的上一个元素,那么它就不是一个重复的元素
        if(nums[fast]!== nums[fast-1]){
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }

    return slow;    
};

2、Review 读一篇英文文章

ReactFlow Layouting Libraries

库名节点大小固定布局算法配置复杂度优点缺点实现细节
Dagre树状简单1、布局有向图的简单库,它具有最小的配置选项,并注重速度而不是选择最优布局。如果您需要将流程组织成树状结构,我们强烈推荐使用 Dagre。节点大小需要固定1、布局完成后,我们将返回一个包含布局节点和边缘的对象。我们通过遍历原始节点列表,并根据 dagre 图中存储的节点更新每个节点的位置来实现这一点
D3-Hierarchy树状图分区布局包围图为所有节点分配相同的宽度和高度,因此如果您要显示许多不同类型的节点,它可能不是最佳选择。布局具有单个根节点的树
D3-Force力导向布局1.  对于较大的图形,每次渲染都计算力布局会导致性能损失很大1.  基于物理原理的布局库,可以通过对节点施加不同的力来定位它们2.  d3-force 的布局算法是迭代的,因此我们需要一种方法来在多次渲染中持续计算布局
Elkjs1.  复杂。通常不推荐使用 elkjs,因为它的复杂性使得在需要支持时很难为用户提供帮助。如果您决定使用它,建议您随时保留原始的 Java API 参考文档作为参考。一个从 Java 移植到 JavaScript 的库,它提供了大量的选项来配置图形的布局
d3-flextree非交互式力布局
entitree-flex非交互式力布局
Cola.js类似于 d3-force 的结果,具有更多的控制能力

3、Technique

在 Go 中,如果我们需要写一个函数,

  1. 有能力统一处理各种值类型的函数,而这些类型可能无法共享同一个接口
  2. 也可能布局未知
  3. 可能这个类型在我们设计函数时还不存在 甚至这个类型会同时存在上面三种问题,那我们就需要用到反射 Reflect。