ARTS Week 01

2019-03-22  本文已影响0人  dotdotdotdotbar

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

最近因为被找工作所困扰,所以还是在这里写一点自己最近的感想吧。
最近找工作不太顺利,感觉主要有好几个方面的原因:

上一篇下一篇

猜你喜欢

热点阅读