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