ARTS Week 01
Algorithm
题目
977. 有序数组的平方
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:[-4,-1,0,3,10]输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11]输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A已按非递减顺序排序。
思路
因为刚开始刷LeetCode,所以从简单的开始。题目还是非常简单的,关键在于需要对数组中有负值的情况进行重排序,然后这种情况就是非常直接的插入排序了,但是效率还是略低的,时间复杂度为O(n^2).
代码
func sortedSquares(A []int) []int {
var result []int
for _, elem := range A {
square := elem * elem
if len(result) == 0 {
result = append(result, square)
} else {
index := -1
for i, value := range result {
if square <= value {
index = i
break
}
}
if index == -1 {
result = append(result, square)
} else {
tail := append([]int{}, result[index:]...)
result = append(result[:index], square)
result = append(result, tail...)
}
}
}
return result
}
Review
Understanding Node.js Event-Driven Architecture
这篇文章从callback、Promise、async/await及EventEmitter四个方面讲解node.js的事件驱动模型,由浅入深。其中收获最大的就是了解了EventEmitter所发射的事件不一定是异步的,文中第一个关于EventEmitter的例子就表明了使用on()添加对事件的监听时,类似添加一个hook函数,所以如果是同步调用emit()方法发射多个事件时,所有的监听函数也都是同步执行。最后作者介绍了实现异步的EventEmitter,并介绍了如何结合async/await实现。
Tip
这周看了阮一峰老师介绍generator异步应用以及async函数实现原理的文章(async函数的实现原理),感觉老师还是讲的简单易懂的,并且给出了一个大致的实现例子:
主要思想就是设计一个generator函数的自动执行器,保证在前一个异步操作执行完成之后才将执行权交还给generator函数。
可以通过callback实现异步操作时的执行权控制,也可以通过Promise的then()方法实现。
参考代码如下:
//自动执行器
function spawn(genF) {
return new Promise(function (resolve, reject) {
const gen = genF();//用户定义的generator函数
// 使用递归实现异步操作的自动执行
function step(nextF) {
let next;
try {
//开始执行yield
next = nextF();
} catch (e) {
return reject(e);
}
if (next.done) {
//generator函数若执行完毕,则将Promise状态置为resolved
return resolve(next.value);
}
// 执行异步函数
Promise.resolve(next.value).then(function (v) {
// 异步函数执行成功继续执行下一个yield
step(function () { return gen.next(v); });
}, function (e) {
// 异步函数执行失败后抛出错误
step(function () { return gen.throw(e); });
});
}
// 启动执行器
step(function () { return gen.next(undefined); });
});
}
function sleep(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms);
});
}
function fn() {
return spawn(function* () {
console.log(`sleep 2000`)
yield sleep(2000);
console.log(`sleep 3000`)
yield sleep(3000);
console.log(`end`);
});
}
fn();
Share
最近因为被找工作所困扰,所以还是在这里写一点自己最近的感想吧。
最近找工作不太顺利,感觉主要有好几个方面的原因:
- 由于转方向的原因,简历不好写,不知道怎么改合适
- 一开始不找准方向,像无头苍蝇一样
- 心态不好,要么就是瞎焦虑,啥都学不进,瞎投简历,要么就是很放松,不学习也不投简历,还有点眼高手低,不踏实。
前前后后也折腾了挺久,终于发现了一件事,就是如果我真的只是不停地找工作,而不去总结,不去改进,不去学习缺失的知识点的话,那感觉到最后也找不到一份比较满意的工作吧。
所以,从现在开始吧,开始总结之前面试中的问题,反思、记录、改进,然后认真的复习,还是要脚踏实地的去做事,才能得到好结果吧。