20180803_ARTS_week06

栏目: 编程语言 · 发布时间: 6年前

内容简介:这个是个比较不好的解法,就是像题目介绍里面那样先把这个『之』字形给做出来,然后再逐行读成字符串,但是通过这个比较好帮助我们理解这个题目。这种就是找一些规律,可以按行构造,也可以按列构造,下面贴个按列构造的方法,还是比较容易懂的,有个 step 用来控制方向,表示要放到哪行的数组里面。

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 年了,每当工作中非常非常沮丧的时候,就拿出来读一读,也就没那么沮丧了。

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

碎碎念

记录一些所思所想,写写科技与人文,写写生活状态,写写读书心得,主要是扯淡和感悟。 欢迎关注,交流。

微信公众号:程序员的诗和远方

公众号ID : MonkeyCoder-Life

20180803_ARTS_week06


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

XML Hacks

XML Hacks

Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95

Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具