20181125_ARTS_week22

栏目: IOS · Android · 发布时间: 5年前

内容简介:本周算法题 Maximum Subarray,看了一篇介绍 ES6 展开操作符和解构技巧的文章,分享了 JavaScript 中获取文件后缀名的小坑与解法,分享了对于产品给用户做选择的一点看法。这个解法来自非常精妙的一个解法,每个数和前一个比,大的保存下来留着和下一个比,短短几行就是一个非常简洁的动态规划算法。

本周算法题 Maximum Subarray,看了一篇介绍 ES6 展开操作符和解构技巧的文章,分享了 JavaScript 中获取文件后缀名的小坑与解法,分享了对于产品给用户做选择的一点看法。

Algorithm

/**
 * Maximum Subarray
 * https://leetcode.com/problems/maximum-subarray/
 * 
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
    for (let i = 1; i < nums.length; i++) {
        nums[i] = Math.max(nums[i], nums[i] + nums[i - 1]);
    }
    return Math.max(...nums);
};

console.log(maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4])) // 6

这个解法来自 https://leetcode.com/problems/maximum-subarray/discuss/139218/Javascript-very-clear-and-short-DP-solution

非常精妙的一个解法,每个数和前一个比,大的保存下来留着和下一个比,短短几行就是一个非常简洁的动态规划算法。

Review

JavaScript hacks for ES6 hipsters

https://hackernoon.com/javascript-hacks-for-es6-hipsters-67d633ce8ace

文章中介绍了几个 ES6 的有趣用法。

比如用解构去做交换:

let a = 'world', b = 'hello'
[a, b] = [b, a]
console.log(a) // -> hello
console.log(b) // -> world
// Yes, it's magic

解构结合 async/await:

const [user, account] = await Promise.all([
  fetch('/user'),
  fetch('/account')
])

展开操作符用在数组连接上:

const one = ['a', 'b', 'c']
const two = ['d', 'e', 'f']
const three = ['g', 'h', 'i']
// Old way #1
const result = one.concat(two, three)
// Old way #2
const result = [].concat(one, two, three)
// New
const result = [...one, ...two, ...three]

展开操作符用在浅拷贝上:

const obj = { ...oldObj }
const arr = [ ...oldArr ]

解构用在让函数参数更具有可读性上:

const getStuffNotBad = (id, force, verbose) => {
  ...do stuff
}
const getStuffAwesome = ({ id, name, force, verbose }) => {
  ...do stuff
}
// Somewhere else in the codebase... WTF is true, true?
getStuffNotBad(150, true, true)
// Somewhere else in the codebase... I ❤ JS!!!
getStuffAwesome({ id: 150, force: true, verbose: true })

总体来说是篇不错的文章,合理运用这些小技巧,可以让你的代码更简洁易懂。

Tip

介绍下 JavaScript 中获取文件后缀名。

一般情况下我们通常可以用正则表达式或者 String 的 split 方法来做。

比如:

function getFileExtension2(filename) {
  return filename.split('.').pop();
}

这种方法通常情况下都能得到正确的后缀名,但是在一些特别情况下会有问题,比如 "abc", ".abc" 这里后缀名都会被认为是 abc。

一种更好的方法是:

function getFileExtension3(filename) {
  return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
}

console.log(getFileExtension3(''));                            // ''
console.log(getFileExtension3('filename'));                    // ''
console.log(getFileExtension3('filename.txt'));                // 'txt'
console.log(getFileExtension3('.hiddenfile'));                 // ''
console.log(getFileExtension3('filename.with.many.dots.ext')); // 'ext'

先用 lastIndexOf 找到 . 最后出现的位置,如果是 "abc" 会返回 -1,如果是 ".abc" 会返回 0,减1之后变为 -2 和 -1,然后做一个无符号右移操作,分别为 4294967294, 4294967295,在这里其实就是去除符号,就算后面 +2 也无济于事,所以最后返回的是 ''

而正常 case 下,-1 之后也是大于等于0的,右移没产生什么作用,之后的 +2 把前面减的 1 给补回来,顺便移到下一位,开始截取。

Share

这周讨论到公司产品在小程序上的一些问题。这里的小程序不单单指微信小程序,甚至包括支付宝小程序,百度小程序等。

一般情况下,说到小程序,大多指微信小程序,不单单是因为微信小程序名气最大,覆盖面最广,还因为微信的使用频率最高,见过手机没装支付宝的,但基本没见过手机没装微信的。

有时候我们在考虑一个产品的时候,会想我们不单提供微信小程序,还提供支付宝小程序,让用户可以选择。

个人觉得,这是一个比较大的误区。让用户做选择不一定是个好主意,好钢用在刀刃上,首先可以算下投入产出比,同样投入做微信小程序和支付宝小程序,如果微信的使用率是 50%,支付宝的使用率是 5%,那在产品形态上自然优先微信小程序,那 5% 的支付宝小程序一般也可以轻易的被微信小程序给取代。

说回给用户选择这个问题上来。往往我们觉得给用户选择是对用户最大的尊重,而实际上却不然。乔布斯没给用户选择,而是告诉用户你用的这个就是最好的,你不需要做选择。就像吃火锅一样,五花八门挑花了眼,浪费太多精力,我最喜欢的就是告诉我先吃啥后吃啥,涮几分钟,吃就得了。

碎碎念

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

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

公众号ID : MonkeyCoder-Life

20181125_ARTS_week22


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

Pro Git

Pro Git

Scott Chacon / Apress / 2009-8-27 / USD 34.99

Git is the version control system developed by Linus Torvalds for Linux kernel development. It took the open source world by storm since its inception in 2005, and is used by small development shops a......一起来看看 《Pro Git》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

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

HEX HSV 互换工具