ARTS

2019-11-11 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description 1108. Defanging an IP Address

Solution

/**
 * @param {string} address
 * @return {string}
 */
// method 1
// var defangIPaddr = function(address) {
//     return address.replace(/\./g, "[.]");
// };

// method 2
var defangIPaddr = function(address) {
    var res = '';
    for (var i = 0; i < address.length; i++) {
        if (address[i] === '.') {
            res += '[.]'
        } else {
            res += address[i];
        }
    }
    return res;
};

Review

Tip

Share

今天学习了,收获

ARTS

2019-01-07 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Valid Parentheses

Solution

/**
 * https://leetcode.com/problems/valid-parentheses/
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    var stack = [];

    var arrs = s.split('');
    var firstItem = arrs.shift();
    if (s.length % 2 !== 0) {
        return false;
    }
    while (arrs.length) {
        var secondItem = arrs.shift();
        if (parenthesesObject[firstItem] === secondItem) {
            firstItem = stack.pop();
            continue;
        }
        stack.push(firstItem);
        firstItem = secondItem;
    }
    if (stack.length) {
        return false;
    }
    return true;
};

var parenthesesObject = {
    '{': '}',
    '(': ')',
    '[': ']',
};

var s = '()';
console.log(isValid(s));

var s = "[";
console.log(isValid(s));

Review

How to write a good README for your GitHub project? https://bulldogjob.com/news/449-how-to-write-a-good-readme-for-your-github-project

如何写一篇好的 Readme。Readme 是我们在开始一个新项目的第一个文件。 Readme 指在是其他人更容易理解我们的代码。 使用英语可以让更多受众了解这个项目。 Readme 用 markdown 格式,使用 markdown 语法。 一篇好的 readme 包含:标题、介绍、技术细节、如何启动几部分,也可包含目录、插图、示例等。 好的示例如下:

Tip

Js 原生的 onchange 就是 input 失去焦点的时候触发的。 oninput 会在 input 输入框值改变的时候实时触发。

Share

最近也在思考如何开发一个 js 库。并不单单只是考虑 js 的逻辑怎么书写,也包含了代码之外的考虑。

代码之外的考虑包含:

  • 脚手架
  • 构建
    • $ npm run build
  • 单元测试
    • $ npm run test
  • 发布
    • $ npm publish
  • 目录结构
    • lib/
    • src/
    • package.json
    • .gitignore
    • .npmrc
    • README.md
    • CHANGELOG.md // 更新日志
    • example // 示例代码。

ARTS

2019-01-01 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Roman to Integer

Solution

/**
 * https://leetcode.com/problems/roman-to-integer/
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    var arr = s;
    var result = 0;
    // arr = [ 'I1', 'I2', 'I3' ];
    // console.log('arr', arr);

    // arr.reduce(function(x, y) {
    //     // console.log('x, y', x, y)
    //     if (romanValue[x] >= romanValue[y]) {
    //         result += (romanValue[x]);
    //     } else {
    //         result -= (romanValue[x]);
    //     }
    //     return y;
    // });

    // for 循环比 reduce 应该要快一些。
    for(var arrIndex = 1; arrIndex < arr.length; arrIndex++) {
        // console.log('arr[arrIndex - 1]', arr[arrIndex - 1], arr[arrIndex]);
        var last = romanValue[arr[arrIndex - 1]];
        // console.log('...last', last, romanValue[arr[arrIndex]]);
        if (last >= romanValue[arr[arrIndex]]) {
            result += last;
        } else {
            result -= last;
        }
    }

    result += romanValue[arr[arr.length - 1]];
    return result;
};

var romanValue = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000,
};

// console.log('romanToInt(\'IV\')', romanToInt('IV'), 4);


console.log('romanToInt(\'I\')', romanToInt('I'), 1);
console.log('romanToInt(\'II\')', romanToInt('II'), 2);
console.log('romanToInt(\'III\')', romanToInt('III'), 3);
console.log('romanToInt(\'IV\')', romanToInt('IV'), 4);
console.log('romanToInt(\'V\')', romanToInt('V'), 5);
console.log('romanToInt(\'VI\')', romanToInt('VI'), 6);
console.log('romanToInt(\'VII\')', romanToInt('VII'), 7);
console.log('romanToInt(\'VIII\')', romanToInt('VIII'), 8);
console.log('romanToInt(\'IX\')', romanToInt('IX'), 9);
console.log('romanToInt(\'XIX\')', romanToInt('XIX'), 19);
console.log('romanToInt(\'XL\')', romanToInt('XL'), 40);
console.log('romanToInt(\'CXLIV\')', romanToInt('CXLIV'), 144);
console.log('romanToInt(\'CD\')', romanToInt('CD'), 400);

console.log('romanToInt(\'LVIII\')', romanToInt('LVIII'), 58);
console.log('romanToInt(\'MCMXCIV\')', romanToInt('MCMXCIV'), 1994);

console.log('romanToInt(\'XC\')', romanToInt('XC'), 90);
console.log('romanToInt(\'XCI\')', romanToInt('XCI'), 91);
console.log('romanToInt(\'XCIX\')', romanToInt('XCIX'), 99);
console.log('romanToInt(\'CM\')', romanToInt('CM'), 900);
console.log('romanToInt(\'CMXCIX\')', romanToInt('CMXCIX'), 999);
console.log('romanToInt(\'MCMXCIX\')', romanToInt('MCMXCIX'), 1999);
console.log('romanToInt(\'MM\')', romanToInt('MM'), 2000);

Review

Things I Don’t Know as of 2018 https://overreacted.io/things-i-dont-know-as-of-2018/?from=timeline&isappinstalled=0

该篇文章是作者阐述自己至 2018 年还未了解的相关技术。

作者表示很多你崇拜的大神也会有你会但是大神不会的技术。

作者承认自己也会有知识缺陷但是也有宝贵的需要多年才能达到的知识。

Tip

99%的程序都没有考虑的网络异常 https://mp.weixin.qq.com/s/S2Eu9coPeikkfIbc3KeusA 这篇文章我理解的就是处理一些平时常见但前端不怎么处理掉错误。用 try catch 解决。

  1. 返回接口数据报错。
  2. 服务不稳定导致的接口报错。
  3. 网络不稳定导致的接口报错。

Share

ARTS

2018-12-23 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Integer to Roman

Solution

/**
 * https://leetcode.com/problems/integer-to-roman/
 * @param {number} num
 * @return {string}
 */
var intToRoman = function(num) {
    if (num >= 4000) {
        new Error('无法处理');
        return null;
    }

    var result = '';
    var count = 0;
    var currentIndex = currentRomanValue.length - 1;
    var currentSymbol = null;
    var lastSymbol = null;
    // var nextSymbol = '';
    var minuend;

    while(num) {
        currentSymbol = currentRomanValue[currentIndex];
        if (currentIndex + 1 < currentRomanValue.length) {
            lastSymbol = currentRomanValue[currentIndex + 1];
        } else {
            // 处理 lastSymbol 为 1000 的时候
            lastSymbol = currentSymbol;
        }

        if (currentIndex >= 2) {
            minuend = currentRomanValue[currentIndex - 1];
            if (!minuend.isMinuend) {
                minuend = currentRomanValue[currentIndex - 2];
            }
        }
        if (currentSymbol.value === minuend.value) {
            // 当前的不能为被减数
            lastSymbol = null;
        }
        count = Math.floor(num / currentSymbol.value);
        num = num % currentSymbol.value;

        // console.log(
        //     'count', count, 'num', num,
        //     'lastSymbol', lastSymbol && lastSymbol.value,
        //     'currentSymbol', currentSymbol.symbol,
        //     'minuend', minuend.value,
        // );

        if (count >= 1) {
            result += repeat(count, currentSymbol.symbol);
        }
        if (lastSymbol && (currentSymbol.value - minuend.value <= num)) {
            result += minuend.symbol + currentSymbol.symbol;
            num = num - (currentSymbol.value - minuend.value);
        }

        if (num < 0) {
            break;
        }
        currentIndex--;
    }
    return result;
};

var repeat = function( num, str ) {
    return new Array(num + 1).join(str);
};

var currentRomanValue = [
    { symbol: 'I', value: 1, isMinuend: true },
    { symbol: 'V', value: 5, isMinuend: false },
    { symbol: 'X', value: 10, isMinuend: true },
    { symbol: 'L', value: 50, isMinuend: false },
    { symbol: 'C', value: 100, isMinuend: true },
    { symbol: 'D', value: 500, isMinuend: false },
    { symbol: 'M', value: 1000, isMinuend: true },
];

// 方法二
var intToRoman = function(num) {
    var M = ['', 'M', 'MM', 'MMM'];
    var C = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'];
    var X = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'];
    var I = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
    return M[Math.floor(num/1000)] + C[Math.floor((num%1000)/100)] + X[Math.floor((num%100)/10)] + I[num%10];
};

// 方法三
var intToRoman = function(num) {
	if (num >= 1000) {
		return "M" + intToRoman(num - 1000)
	}

	if (num >= 900) {
		return "CM" + intToRoman(num - 900)
	}

	if (num >= 500) {
		return "D" + intToRoman(num - 500)
	}

	if (num >= 400) {
		return "CD" + intToRoman(num - 400)
	}

	if (num >= 100) {
		return "C" + intToRoman(num - 100)
	}

	if (num >= 90) {
		return "XC" + intToRoman(num - 90)
	}

	if (num >= 50) {
		return "L" + intToRoman(num - 50)
	}

	if (num >= 40) {
		return "XL" + intToRoman(num - 40)
	}

	if (num >= 10) {
		return "X" + intToRoman(num - 10)
	}

	if (num >= 9) {
		return "IX" + intToRoman(num - 9)
	}

	if (num >= 5) {
		return "V" + intToRoman(num - 5)
	}

	if (num >= 4) {
		return "IV" + intToRoman(num - 4)
	}

	if (num >= 1) {
		return "I" + intToRoman(num - 1)
	}
	return '';
};

// Symbol       Value
// I             1
// V             5
// X             10
// L             50
// C             100
// D             500
// M             1000

console.log('intToRoman(1)', intToRoman(1), 'I');
console.log('intToRoman(2)', intToRoman(2), 'II');
console.log('intToRoman(3)', intToRoman(3), 'III');
console.log('intToRoman(4)', intToRoman(4), 'IV');
console.log('intToRoman(5)', intToRoman(5), 'V');
console.log('intToRoman(6)', intToRoman(6), 'VI');
console.log('intToRoman(7)', intToRoman(7), 'VII');
console.log('intToRoman(8)', intToRoman(8), 'VIII');
console.log('intToRoman(9)', intToRoman(9), 'IX');
console.log('intToRoman(19)', intToRoman(19), 'XIX');
console.log('intToRoman(40)', intToRoman(40), 'XL');
console.log('intToRoman(144)', intToRoman(144), 'CXLIV');
console.log('intToRoman(400)', intToRoman(400), 'CD');

console.log('intToRoman(58)', intToRoman(58), 'LVIII');
console.log('intToRoman(1994)', intToRoman(1994), 'MCMXCIV');

console.log('intToRoman(90)', intToRoman(90), 'XC');
console.log('intToRoman(91)', intToRoman(91), 'XCI');
console.log('intToRoman(99)', intToRoman(99), 'XCIX');
console.log('intToRoman(900)', intToRoman(900), 'CM');
console.log('intToRoman(999)', intToRoman(999), 'CMXCIX');
console.log('intToRoman(1999)', intToRoman(1999), 'MCMXCIX');
console.log('intToRoman(2000)', intToRoman(2000), 'MM');

Review

Create and Test Decorators in JavaScript https://netbasal.com/create-and-test-decorators-in-javascript-85e8d5cf879c

该文章指导我们如何使用 Decorator 去修饰类、方法和属性。并且如何去测试 Decorator。测试 Decorator 与测试普通函数几无二致。

Tip

tabindex:元素使用Tab键进行focus时候的顺序值

div 要加这个属性,才能用 js 去 focus 该 div。 https://www.zhangxinxu.com/wordpress/2017/05/html-tabindex/

Share

未完待续。。。

ARTS

2018-12-17 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Longest Common Prefix

Solution

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    var prefix = strs[0];

    var strIndex = 0;
    var res;
    while(strIndex < strs.length) {
        res = strs[strIndex].match('^' + prefix);
        if (!res) {
            prefix = prefix.slice(0, -1);
        } else {
            strIndex++;
        }
    }
    return (res && res[0]) || '';
};

var arr = ["flower","flow","flight"];
console.log(arr, longestCommonPrefix(arr), 'fl');
arr = ["dog","racecar","car"];
console.log(arr, longestCommonPrefix(arr), '');
arr = ["flower","flow","flight"];
console.log(arr, longestCommonPrefix(arr), 'fl');
arr = ["flower"];
console.log(arr, longestCommonPrefix(arr), 'flower');

Review

Data Classes https://kotlinlang.org/docs/reference/data-classes.html#data-classes

定义 data class

data class User(val name: String, val age: Int)

意味着

public class User {

    private final String name;
    private final Int age;

    public User(String name, Int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Int getAge() {
        return age;
    }

    @Override
    public boolean equals(Object other) {
        ...
    }

    @Override
    public int hashCode() {
        ...
    }

    @Override
    public String toString() {
        ...
    }

}

Tip

UGC / PGC

UGC(User-generated Content,用户生产内容) PGC(Professionally-generated Content,专业生产内容)

Share

未完待续。。。

hackathon 有感而发

2018-12-10 00:00:00 +0000

短短 2 天 hackathon 就结束了。没有得奖,聊以为重在参与。

感觉强压或疲劳的状态下就容易影响判断。遇到一个小 bug,'float32' is not JSON serializable,结果我这边花了好多时间都解决不了。。。而中国东西其实很简单的只要把 numpy float32 的那个数字改为 float 或者改为 string 就好啦。

心得体会:

  1. 不能高估自己
  2. 可能很简单的问题,临场就是想不出来
  3. 要有充足的睡眠

未完待续。。。

ARTS

2018-12-10 00:00:00 +0000

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Container With Most Water

Solution

/**
 * https://leetcode.com/problems/container-with-most-water/
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    if (height <= 1) return 0;
    var res = 0;
    var currentHeight;
    var index1 = 0;
    var index2 = height.length - 1;
    var distance = index2 - index1;
    while(true) {
        if (index1 >= height.length) {
            break;
        }
        if (index2 <= index1) {
            break;
        }

        distance = index2 - index1;

        if (height[index1] < height[index2]) {
            currentHeight = height[index1];
            index1++;
        } else {
            currentHeight = height[index2]
            index2--;
        }
        var tmpRes = currentHeight * distance;
        if (res < tmpRes) {
            res = tmpRes;
        }
    }
    // algorithm 2
    // for (var index1 = 0; index1 < height.length; index1++) {
    //     for (var index2 = height.length; index2 > index1; index2--) {
    //         if (height[index1] < height[index2]) {
    //             currentHeight = height[index1];
    //         } else {
    //             currentHeight = height[index2]
    //         }
    //         distance = index2 - index1;
    //         var tmpRes = currentHeight * distance;
    //         if (res < tmpRes) {
    //             res = tmpRes;
    //         }
    //     }
    // }
    return res;
};

var arr;
arr = [1,8,6,2,5,4,8,3,7];
console.log('maxArea', maxArea(arr), 49);
arr = []
console.log('maxArea', maxArea(arr));
arr = [1];
console.log('maxArea', maxArea(arr), 0);

arr = [1,8,6,2,5,4,8,3,7, 8];
console.log('maxArea', maxArea(arr), 64);
arr = [2,3,4,5,18,17,6]
console.log('maxArea', maxArea(arr), 17);

Review

5.4. Numeric Types — int, float, long, complex https://docs.python.org/2/library/stdtypes.html#typesnumeric

数字类型

这则文档介绍了 Python 中的数字类型:整数、浮点数、长整型和复数。

Python 标准的 float 就是 C 的 double 类型。基本的加减乘除都是有的,取整,取绝对值变更数字类型也不在话下。

Tip

Python3 解析 Json 直接就是 json.dumps,但是如果遇到数字是 float32 的情况的时候,Python 不会自己去动态转类型,会报错 'float32' is not JSON serializable。这个时候可以解决的方式有,str(float32Number) 或者 float(float32Number) 等。

Share

Hackathon 有感而发

https://lincolnge.github.io/programming/2018/12/10/hackathon.html

tensorflow

2018-12-03 00:00:00 +0000

Install TensorFlow

配置指南:

# Python3
$ brew install python
# 在 profile 中添加 Python3 环境变量
$ cat ~/.bash_profile
export PATH="/usr/local/opt/python/libexec/bin:$PATH”

$ pip install six bumpy

$ pip install tensorflow

注意事项:

pip install tensorflow 出错

$ pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.8.0-py3-none-any.whl
# 装 1.8 的版本使用 TensorFlow 最新代码编译出错,这时应该装最新版的 TensorFlow。
$ pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.12.0-py3-none-any.whl

https://github.com/tensorflow/tensorflow/issues/20444

ARTS

2018-12-02 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description Regular Expression Matching

Solution

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function(s, p) {
    var matchRes =  s.match(p);
    return (matchRes && matchRes[0]) === s;
};

最近几周一直想着 TensorFlow 和大数据只能说草草写了算法。我理解这个题目是希望实现一个正则匹配,而不是简单实用内置的正则。

Review

Image Recognition https://www.tensorflow.org/tutorials/images/image_recognition

图像识别

TensorFlow 的图像识别指在使用 Inception-v3 的理论去识别人类不费吹灰之力的图像识别。

Tip

JS 的 Decorator 可以继续套 Decorator,此时新的 Decorator 修饰的是它里面的 Decorator 函数。

Share

TensorFlow 环境搭建

https://lincolnge.github.io/programming/2018/12/03/tensorflow.html

ARTS

2018-11-26 00:00:00 +0000

ARTS

  • A (Algotithm) 至少做一个leetcode的算法题
  • R (Review) 阅读并点评一篇英文的技术文章
  • T (Tip) 学习一个技术技巧
  • S (Share) 分享一篇有观点和思考的技术文章

每周一次,坚持一年

Algorithm

Description ZigZag Conversion

Solution

/**
 * https://leetcode.com/problems/zigzag-conversion/
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    if (numRows == 1) return s;

    // let rows = new Array(numRows);
    var rows = [];
    for (var i = 0; i < numRows; i++) {
        rows[i] = [];
    }

    var curRow = 0;
    var goingDown = false;
    for (var i = 0; i < s.length; i++) {
        // if (!rows[curRow]) rows[curRow] = [];
        rows[curRow].push(s[i]);
        if (curRow === 0 || curRow === numRows - 1) goingDown = !goingDown;
        curRow += goingDown ? 1 : -1;
    }

    var result = '';
    for (var i = 0; i < rows.length; i++) {
        for (var j = 0; j < rows[i].length; j++) {
            result += rows[i][j];
        }
        // result += rows[i].join(''); // 原生的 for 循环更快。
        // result = result.concat(rows[i]); // concat 更慢。。。
    }
    return result;
};


console.log(convert('PAYPALISHIRING', 3), 'PAHNAPLSIIGYIR', convert('PAYPALISHIRING', 3) === 'PAHNAPLSIIGYIR');
console.log(convert('PAYPALISHIRING', 4), 'PINALSIGYAHRPI', convert('PAYPALISHIRING', 4) === 'PINALSIGYAHRPI');
console.log(convert('Apalindromeisaword,phrase,number,orothersequenceofunitsthatcanbereadthesamewayineitherdirection,withgeneralallowancesforadjustmentstopunctuationandworddividers.', 2)
    ===
    "Aaidoeswr,haenme,rtesqecouishtabrateaeaietedrcinwtgnrlloacsoajsmnsoucutoadodiiesplnrmiaodprs,ubroohreunefnttacneedhsmwynihrieto,iheeaalwnefrdutettpntainnwrdvdr."
)

// convert('PAYPALISHIRING', 3);

Review

Exploring EcmaScript Decorators https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841

探索 JS 装饰器

装饰器就是接收一个函数并返回具有附加功能的函数。装饰器为调用高阶函数提供了一种非常简单的语法。

Tip

bee’s knees

出類拔萃的人或事物

https://www.businessweekly.com.tw/article.aspx?id=18435&type=Blog

Share

未完待续…