ARTS
- 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 有感而发
短短 2 天 hackathon 就结束了。没有得奖,聊以为重在参与。
感觉强压或疲劳的状态下就容易影响判断。遇到一个小 bug,'float32' is not JSON serializable
,结果我这边花了好多时间都解决不了。。。而中国东西其实很简单的只要把 numpy float32 的那个数字改为 float 或者改为 string 就好啦。
心得体会:
- 不能高估自己
- 可能很简单的问题,临场就是想不出来
- 要有充足的睡眠
未完待续。。。
ARTS
- 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
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
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
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
未完待续…
关于安全的日常操作
安全对于我们平时工作中是一件很重要的事情。
因此在日常中我们应该尽可能做好并且规避一些不安全的操作。
密码使用密码管理器
比如说使用 1Password、keychain 这些密码工作。iOS 的 keychain 在 iOS 12 的时候也可以在 App 上直接调取 keychain 中的账号密码,非常方便。keychain 本身就可以生成随机密码。
ssh 使用不同的秘钥
比如公司的 Git 仓库与 GitHub 分别使用不同的 ssh 秘钥
╰─$ ls ~/.ssh
config id_rsa.github id_rsa.example
其中 config 为秘钥的配置项,ssh 到不同的服务器时可自动切换为不同的秘钥。
╰─$ cat config
Host *
ControlPersist yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Host *.example.com
IdentityFile ~/.ssh/id_rsa.example
User xxxx@example.com
Host *github.com
IdentityFile ~/.ssh/id_rsa.github
User xxxx@qq.com
引用:
- Set up iCloud Keychain https://support.apple.com/en-us/HT204085
ARTS
ARTS
- A (Algotithm) 至少做一个leetcode的算法题
- R (Review) 阅读并点评一篇英文的技术文章
- T (Tip) 学习一个技术技巧
- S (Share) 分享一篇有观点和思考的技术文章
每周一次,坚持一年
Algorithm
Description Palindrome Number
Solution
/**
* https://leetcode.com/problems/palindrome-number/
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
return false;
}
var array = String(x).split('');
var length = array.length;
var left = null;
var right = null;
for (left = 0, right = length - 1; left < right; left += 1, right -= 1) {
if (array[left] !== array[right]) {
return false;
}
}
return true;
};
// var isPalindrome = function(x) {
// if (x % 10 === 0 && x !== 0) return false;
// if (x < 0) {
// return false;
// }
// var newNumber = Number(String(x).split('').reverse().join(''));
// if (x === newNumber) {
// return true;
// }
// return false;
// };
console.log(isPalindrome(121), true);
console.log(isPalindrome(123), false);
console.log(isPalindrome(-121), false);
console.log(isPalindrome(10), false);
console.log(isPalindrome(0), true);
Review
How to Build Amazing Development Teams https://medium.com/s/story/building-amazing-development-teams-ebeca87eb124
如何组建一支优秀的团队
一支优秀的技术团队足以胜任企业中在技术中面临的挑战与困难。 建立一支优秀的团队是相互的,管理者需要给 team 里面每个成员以成长空间,团队成员也能尽己所能而成长。雇佣愿意学习的开发。训练、动机、责任心、人是一个优秀团队凝聚的核心。同理,如果我们想要进一个优秀的团队,也应该让自己在这几个方面有所建树。
Tip
vue 的 store 如果太大将会影响页面的性能。 这个时候可以这么去处理。
- 减少 store 的大小。
- JSON数据规范化(normalize)。
https://juejin.im/post/5b960fcae51d450e9d645c5f
Share
关于安全的一些日常操作
https://lincolnge.github.io/science/2018/11/19/security.html
ARTS
ARTS
- A (Algotithm) 至少做一个leetcode的算法题
- R (Review) 阅读并点评一篇英文的技术文章
- T (Tip) 学习一个技术技巧
- S (Share) 分享一篇有观点和思考的技术文章
每周一次,坚持一年
Algorithm
Description https://leetcode.com/problems/string-to-integer-atoi/
Implement atoi which converts a string to an integer.
The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.
If no valid conversion could be performed, a zero value is returned.
Note:
Only the space character ' ' is considered as whitespace character.
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. If the numerical value is out of the range of representable values, INT_MAX (2^31 − 1) or INT_MIN (−2^31) is returned.
Example 1:
Input: "42"
Output: 42
Example 2:
Input: " -42"
Output: -42
Explanation: The first non-whitespace character is '-', which is the minus sign.
Then take as many numerical digits as possible, which gets 42.
Example 3:
Input: "4193 with words"
Output: 4193
Explanation: Conversion stops at digit '3' as the next character is not a numerical digit.
Example 4:
Input: "words and 987"
Output: 0
Explanation: The first non-whitespace character is 'w', which is not a numerical
digit or a +/- sign. Therefore no valid conversion could be performed.
Example 5:
Input: "-91283472332"
Output: -2147483648
Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer.
Thefore INT_MIN (−2^31) is returned.
Solution
/**
* @param {string} str
* @return {number}
* https://leetcode.com/problems/string-to-integer-atoi/
*/
var myAtoi = function(str) {
var result = parseInt(str, 10);
if (isNaN(result)) {
return 0;
}
if (result >= Math.pow(2, 31)) {
return Math.pow(2, 31) - 1;
} else if (result < -Math.pow(2, 31)) {
return -Math.pow(2, 31);
}
return result;
};
console.log(myAtoi('42'), 42);
console.log(myAtoi('+-42'), 0);
console.log(myAtoi(' -42'), -42);
console.log(myAtoi('4193 with words'), 4193);
console.log(myAtoi('words and 987'), 0);
console.log(myAtoi('-91283472332'), -2147483648);
/**
* https://segmentfault.com/a/1190000010571914
* JavaScript 实现 parseInt()
*/
Review
Comparing Flow with TypeScript https://medium.com/the-web-tub/comparing-flow-with-typescript-6a8ff7fd4cbb
这篇文章指在比较 Flow 与 Typescript 的异同。
Flow 和 Typescript 皆是使 JavaScript 可以以静态类型的方式去书写,即可使用静态类型语音的优势。但是 Flow 比 Typescript 更简单,开箱即用、对库/框架/编译器更好的兼容性、它有能力保持 JS 的纯粹。只在项目开头添加 // @flow
即可。
Tip
JS: Array.reverse() vs. for and while loops https://jsperf.com/js-array-reverse-vs-while-loop/66
我们可以从这篇文章获知 JS 的数组颠倒使用 for 循环的 swap half、XOR swap half 效率最高。
Share
css 的 white-space
换行符 | 空格和 Tab | 文本超出容器宽度 | - |
---|---|---|---|
nomal | 忽略 | 折叠 | 换行 |
nowrap | 忽略 | 折叠 | 不换行 |
pre | 换行 | 保持原样 | 不换行 |
pre-wrap | 换行 | 保持原样 | 换行 |
pre-line | 换行 | 折叠 | 换行 |
相关文档:
ARTS
ARTS
- A (Algotithm) 至少做一个leetcode的算法题
- R (Review) 阅读并点评一篇英文的技术文章
- T (Tip) 学习一个技术技巧
- S (Share) 分享一篇有观点和思考的技术文章
每周一次,坚持一年
Algorithm
Description
Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
Solution
/**
* https://leetcode.com/problems/reverse-integer/
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
var result = Math.abs(x);
symbol = 1;
var infinityNum = Math.pow(2, 31);
console.log('infinityNum', infinityNum);
if (x < 0) {
symbol = -1;
}
var resultValue = Number(String(result).split('').reverse().join('')) * symbol;
if (resultValue > infinityNum - 1 || resultValue < -infinityNum) {
resultValue = 0;
}
return resultValue;
};
// console.assert(reverse(123), 321);
// console.assert(reverse(-123), -321);
// console.assert(reverse(120), 21);
// console.log(reverse(123), 321);
// console.log(reverse(-123), -321);
// console.log(reverse(120), 21);
// console.log(1534236469, reverse(1534236469));
Review
How to set up a TypeScript project https://medium.freecodecamp.org/how-to-set-up-a-typescript-project-67b427114884
这篇文章指导我们如何搭建一个 React TS 的项目。指导我们选择 ES 的某个版本的原因,诸如浏览器版本、浏览器内核、JS 大小等。之后的安装步骤可直接查看文章。
Tip
TypeScript ESLint Parser https://github.com/eslint/typescript-eslint-parser
typescript-eslint-parser
是一个 Eslint 的解析器,利用 TypeScript ESTree 允许ESLint使用Iint TypeScript源代码。
Share
Eslint vs Tslint
优缺点对比
- Eslint 可以继承项目原本的配置项。
- Tslint 需要重新配置。
- Tslint 对 vue 并不友好。
- Eslint 可能无法校验 Tslint 的部分逻辑。
typescript-eslint-parser
是通过编译 TS 到一个 Eslint 可识别的代码,然后再运行 Eslint 规则。所以一些 TS 特有的规则 (type/interface 等)全部无法校验,这种代码校验对于 TS 项目来说是不完整的。typescript-eslint-parser
对一部分 ESLint 规则支持性不好
相关文档: