20180803_ARTS_week06

Algorithm

/**
 * https://leetcode.com/problems/zigzag-conversion/description/
 * 
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function (s, numRows) {
    var step = numRows + numRows - 2
    var storeArray = new Array(numRows).fill("")
    var len = s.length  + step

    // 特别 case
    if (s.length < numRows || numRows < 2 || s.length < 2) {
        return s;
    }

    for(var i=0; i<len; i+=step) {
        for (var j=0; j<step; j+=1) {
            if(!s[i+j]){
                break;
            }
            if( j/numRows < 1 ) { // 前 numRows 个
                var pos = j%numRows
                storeArray[pos] += s[i+j]
            } else {
                storeArray.forEach(function(value, index, arr){
                    if( index + j == step ) {
                        storeArray[index] += s[i+j]
                    } else {
                        // storeArray[index] += " "
                    }
                })
            }
        }
    }

    return storeArray.join("")
};

console.log(convert("PAYPALISHIRING", 3)) // PAHNAPLSIIGYIR
/*
P   A   H   N
A P L S I I G
Y   I   R
*/
console.log(convert("PAYPALISHIRING", 4)) // PINALSIGYAHRPI
/*
P     I    N
A   L S  I G
Y A   H R
P     I
*/
console.log(convert("AB", 1)) // AB

这个是个比较不好的解法,就是像题目介绍里面那样先把这个『之』字形给做出来,然后再逐行读成字符串,但是通过这个比较好帮助我们理解这个题目。

这种就是找一些规律,可以按行构造,也可以按列构造,下面贴个按列构造的方法,还是比较容易懂的,有个 step 用来控制方向,表示要放到哪行的数组里面。

var convert = function (s, numRows) {
    // var result = [];
    var result = new Array(numRows).fill("");
    var step = 1, index = 0;

    // 排除一些特殊情况
    if (s.length < numRows || numRows < 2 || s.length < 2) {
        return s;
    }

    for (var i = 0; i < s.length; i++) {
        // if (result[index] === undefined) { // 排除掉一些特别情况之后,可以用 Array().fill() 来构造数组
        //     result[index] = '';
        // }
        result[index] += s[i];
        if (index === 0) {
            step = 1;
        } else if (index === numRows - 1) {
            step = -1;
        }
        index += step;
    }
    return result.join('');
};

console.log(convert("PAYPALISHIRING", 3))
console.log(convert("PAYPALISHIRING", 4))
console.log(convert("AB", 1))

Review

https://hackernoon.com/what-i-learned-from-doing-1000-code-reviews-fe28d4d11c71

What I learned from doing 1000 code reviews

作者结合他的个人经验给出了 4 条他常见的 code review 建议。

  1. 当出错的时候抛出异常。 这个比较好理解,举个例子,比如一个 Restfull 接口用来获取用户列表,当程序出错的时候没有报错,而是返回了一个空列表,并且 HTTP 返回码是 200。这个时候监控系统并不知道这个接口或者服务出错了,所以抛出一个异常,是更好的做法。
  2. 尽可能使用最特定的类型。 主要是从发现错误的数据,以及当发现数据有问题时提前报错。而且最特定的类型就是函数的签名,也是函数最好的注释。
  3. 使用 Optionals 代替 null。 这里主要是根据 Java 8 的 Optional 特性来说的。作者认为 Optional 有一个好处是不需要通过阅读文档来确定值是否可能不存在。
  4. “Unlift” methods whenever possible 这个 “Unlift" 我不是很理解,作者给了个例子: javascript // AVOID: T method(A param1, B param2, Optional<C> param3); // PREFER: T method(A param1, B param2, C param3); T method(A param1, B param2); // This method is clearly doing two things, it should be two methods // The same is true for boolean parameters 大意是作者建议不要在参数或者返回值用 Optional。

Tip

介绍下 ES5 中 Object.freeze() 方法。

Object.freeze() 方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。

var obj = {
  prop: function() {},
  foo: 'bar'
};

// 新的属性会被添加, 已存在的属性可能
// 会被修改或移除
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

// 作为参数传递的对象与返回的对象都被冻结
// 所以不必保存返回的对象(因为两个对象全等)
var o = Object.freeze(obj);

o === obj; // true
Object.isFrozen(obj); // === true

// 现在任何改变都会失效
obj.foo = 'quux'; // 静默地不做任何事
// 静默地不添加此属性
obj.quaxxor = 'the friendly duck';

// 在严格模式,如此行为将抛出 TypeErrors
function fail(){
  'use strict';
  obj.foo = 'sparky'; // throws a TypeError
  delete obj.quaxxor; // throws a TypeError
  obj.sparky = 'arf'; // throws a TypeError
}

fail();

// 试图通过 Object.defineProperty 更改属性
// 下面两个语句都会抛出 TypeError.
Object.defineProperty(obj, 'ohai', { value: 17 });
Object.defineProperty(obj, 'foo', { value: 'eit' });

// 也不可能设置属性
// 下面两个语句都会抛出 TypeError.
Object.setPrototypeOf(obj, { x: 20 })
obj.__proto__ = { x: 20 }

在 Vue 中这个有一个好处就是如果你有一个 Object,并且不会修改,使用 Object.freeze() 可以让性能大幅提升。根据 https://juejin.im/entry/57a83edd128fe100549006aa 这里说的,性能提升有 5~10 倍

new Vue({
    data: {
        // vue 不会对 list 里的 object 做 getter、setter 绑定
        list: Object.freeze([
            { value: 1 },
            { value: 2 }
        ])
    },
    created () {
        // 界面不会有响应
        this.list[0].value = 100;

        // 下面两种做法,界面都会响应
        this.list = [
            { value: 100 },
            { value: 200 }
        ];
        this.list = Object.freeze([
            { value: 100 },
            { value: 200 }
        ]);
    }
})

更多关于 Object.freeze() 的内容可以参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

Share

这周分享一本书《程序员修炼之道--从小工到专家》。 这不是我第一次在博客或者别的地方推荐这本书,如果一定要选一本我最喜欢的书,那我一定会选这本。

这本书是我第一任领导推荐我读的,当时我工作上遇到比较大问题,刚毕业,项目中只有我一个前端,遇到挺多问题,意志比较消沉,也有点闹情绪,当时他推荐我读这本书。现在我依然记得读了第一章第一节那个晚上一整晚没睡好觉,这一节说的是『负责』,对你的代码负责,对你自己和你自己的行为负责。

『负责』多么浅显的道理,却总是被我们遗忘在角落,因为上线时间等情况留下的破窗户,是不是因为没有足够负责。当然,书中也不是让你一味负责死撑,『不要害怕提出要求,也不要害怕承认你需要帮助』。

现在距离我第一次读这本书,已经过去 6 年了,每当工作中非常非常沮丧的时候,就拿出来读一读,也就没那么沮丧了。

刚好今天又遇到很沮丧的事情,拿出来翻一翻,似乎真的没那么沮丧了,希望在明天。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 20180914_ARTS_week12

    因为之前做过 Integer to Roman 这个 Roman to Integer 还是比较容易有思路,和 Integer to Roman 差不多,但是这...

    Bob.Chen
  • Canvas基础-粒子动画Part1

    网页上各种酷炫的粒子动画看的人眼花缭乱,实际上原理却非常简单。 获取像素信息 首先我们需要画张图到Canvas上,这里因为我懒的扣图(实际上是不会),就找...

    Bob.Chen
  • 20180818_ARTS_week08

    这道题是要把字符串中的数字变成 int,通常的做法是遍历字符串,然后判断是不是在 0~9 中,如果把 0~9 放数组里每次循环检查感觉不是太好,时间复杂度是个 ...

    Bob.Chen
  • 为啥PHP in_array(0,['a', 'b', 'c']) 返回为true?

    但是,直观上看, 0并没有包含在['a', 'b', 'c']数组中,也不会等于'abc'这个字符串。那怎么解释上述的返回结果呢?

    架构精进之路
  • windows编程学习笔记(三)ListBox的使用方法

    ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收...

    Masimaro
  • JavaScript的操作符

    ++,--,+,-操作符应用任何类型数值都返回一个【数值类型】,先将任意类型的值转换为Number然后进行运算(通过Number()方法进行转换)

    小小鱼儿小小林
  • Object.wait以及notify注解

    该方法的注释说:使调用线程处于wait状态,直到其他线程调用这个Object的notify或者notifyAll才会被唤醒。这个方法只能被拥有这个Object的...

    None_Ling
  • 炫技!JavaScript 的花式玩法

    JavaScript 是一个伟大的语言。它有简单的语法,完善的生态系统,更重要的,有一个庞大的社区。

    疯狂的技术宅
  • 关于软件重构的灵魂四问

    在软件工程学中重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

    xcbeyond
  • 【Leetcode】58. 最后一个单词的长度

    这个题比较水,主要是注意一下前后有空格这种情况。 如下代码用preLong记录截止到当前字符最后一个单词的长度.

    Leetcode名企之路

扫码关注云+社区

领取腾讯云代金券