美文网首页
ARTS Week 01

ARTS Week 01

作者: dotdotdotdotbar | 来源:发表于2019-03-22 20:23 被阅读0次

    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

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

    • 由于转方向的原因,简历不好写,不知道怎么改合适
    • 一开始不找准方向,像无头苍蝇一样
    • 心态不好,要么就是瞎焦虑,啥都学不进,瞎投简历,要么就是很放松,不学习也不投简历,还有点眼高手低,不踏实。
      前前后后也折腾了挺久,终于发现了一件事,就是如果我真的只是不停地找工作,而不去总结,不去改进,不去学习缺失的知识点的话,那感觉到最后也找不到一份比较满意的工作吧。
      所以,从现在开始吧,开始总结之前面试中的问题,反思、记录、改进,然后认真的复习,还是要脚踏实地的去做事,才能得到好结果吧。

    相关文章

      网友评论

          本文标题:ARTS Week 01

          本文链接:https://www.haomeiwen.com/subject/xnabmqtx.html