内容简介:ARTS 是耗子哥(左耳朵耗子)发起的一个活动。A -- Algorithm 每周一道算法题R -- Review 每周阅读并点评一篇英文技术文章
ARTS 是耗子哥(左耳朵耗子)发起的一个活动。
A -- Algorithm 每周一道算法题
R -- Review 每周阅读并点评一篇英文技术文章
T -- Tip 每周学习一个技术技巧
S -- Share 每周分享一篇技术文章
坚持一年 :-)
这是我的第三周 ARTS
Algorithm
/** https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { var i = 0, maxNum = 0, curNum = 0, subStringList = []; for(i; i<s.length; i+=1) { var charItem = s[i], charPos = subStringList.indexOf(charItem); // O(n) if (charPos != -1) { // 找到了 subStringList.splice(0, charPos+1) // O(n) } subStringList.push(charItem) curNum = subStringList.length if (curNum > maxNum) { maxNum = curNum } // maxNum = Math.max(curNum, maxNum) } return maxNum }; // console.log(lengthOfLongestSubstring("abcabcbb")) // console.log(lengthOfLongestSubstring("bbbbb")) // console.log(lengthOfLongestSubstring("pwwkew")) console.log(lengthOfLongestSubstring("dvdf"))
题目寻找最大子串,一开始没想到特别好的方法, 后来看了下大家的讨论,主要是用移动窗口的方式记录当前寻找的子串,当发现重复字符的时候,起始位置就从下一个开始。
其中,因为要检查记录下来的子串中是否和当前的字符有重复,这里用到了 Array.indexOf 方法,这个方法时间复杂度是 O(n),本来想用 ES6 提供的 Set 类型数据结构的 has 方法来检查,虽然 has 方法的时间复杂度是 O(1),但是当发现重复时 Set 不方便删除一序列元素,还是要转为 Array 操作,实际耗时反而比较长。
另外,我这里贪方便直接 Sting[i] 用下标来取字符串中的字符,IE 下应该是有兼容性问题,可以先 String.split('') 把 String 转为 Array。
Rewiew
GraphQL: front-end queries made easy
这是一篇介绍前端使用 GraphQL 的文章。
- 简单介绍了的 GraphQL 是什么,是 FaceBook 推行的一种查询语言。我个人觉得更像一种接口约定 DSL。
- 接口约束的表现形式,表达上和 FaceBook 以前推出的 Thrift 有点像。
- GraphQL 与 Rest API + Swagger 的一些比较,作者认为 Swagger 在正确的使用时还是挺有用的。
- 简单描述了前端使用 GraphQL 的方式,文中主要介绍的是依赖一个开源库 apollo-client ,apollo-client 也能用在 Angular,React,Vue 中。
- 以及介绍了 React 使用 GraphQL 的另一个库 Relay ,这个库也是 FaceBook 开源的。
总体来说,文章讲的比较简单,对前端了解 GraphQL 是做什么的有一定帮助,如果想更多的了解 GraphQL 可以参考 https://www.howtographql.com
Tip
分享一个写 Vue 组件时候的小 Tip。 平常在做父子组件传值通信的时候,通常是父组件用属性传到子组件的 props 中,然后子组件再一个个绑定到子组件各个 dom 上。 这时,有一种情况,比如子组件是对输入框的封装,子组件外层一般会用 div 等元素包裹,父组件直接传的属性只会被绑定到最外层的 div 上,子组件在做的时候就要一个一个把可能用到的属性都用 props 暴露出去,很多冗余代码。
这个时候,可以借助 inheritAttrs: false
来改变这种默认行为,同时在子组件结合 $attrs
来解决把一堆属性绑定到一个元素上的问题。
示例代码如下:
<div id="app"> <parent></parent> </div> <template id="parent-component"> <div> <h1>Parent</h1> <inherited-child :id="id" tmp="tmp" v-bind="$attrs" @click="sayHello"></inherited-child> <noninherited-child :id="id" :tmp="tmp" v-bind="$attrs" @click="sayHello"></noninherited-child> </div> </template> <template id="child-component"> <div v-on="$listeners"> <h1>Child</h1> <div> $attrs -> {{$attrs}} </div> </div> </template> <template id="child-component2"> <div > <h1 v-on="$listeners">Child</h1> <div :id="$attrs.id"> $attrs -> {{$attrs}} </div> </div> </template> <script src="https://unpkg.com/vue@2.4"></script>
new Vue({ el: '#app', components: { 'parent': { name: 'parent', template: '#parent-component', data: function() { return { tmp: '123', id: 'Hello', } }, methods: { sayHello: function() { window.alert('hello123!'+this.tmp) } }, components: { 'inherited-child': { name: 'inherited-child', template: '#child-component' }, 'noninherited-child': { inheritAttrs: false, name: 'noninherited-child', template: '#child-component2' } } } } })
#Hello { color: white; background-color: tomato; border-radius: 10px; padding: 10px; }
在线地址: https://jsfiddle.net/Bob_Chen/5wgy0rjo/
延伸阅读: https://vuejsdevelopers.com/2018/06/18/vue-components-play-nicely
Share
刚好这周看了一篇讲 GraphMQ 的文章,联想到以前用过的几种类似的东西,简单分享一下 :-)
SOAP
SOAP 是一个比较老的协议,用的是 XML 格式,可读性不是很好,之前做的时候借助 SOAP UI 等 工具 做可视化会方便很多。
个人感觉 SOAP 是一个比较重的协议,输入输出定义也比较严谨,可能是因为使用 XML 的关系,现在好像用的已经不多了。
Thrift
我第一次知道 Thrift 是因为以前有个项目是 SOAP 接口的,后来有个客户他们是用 Thrift 的,于是我们就把接口层从 SOAP 改为了 Thrift。
刚接触 Thrift 的时候,我就被它震惊了,简单定义好接口描述文件,用的是它自己的一套 DSL,然后执行个命令行,相关客户端和服务端代码就生成好了,而且支持生成多种语言,包括各种结构体的定义。 接口描述文件相对 SOAP 可读性更好,有时候甚至不用读,跑个命令行代码生成好了,直接看代码,这就叫【Talk is cheap, show me the code】
不足之处是有些生成的代码依赖 Thrift 自身的发展。比如用的时候生成的 python 服务端代码是不建议用在生产环境的。
Rest API
Rest 和上面两个来讲,不是一个协议,而更像一种接口风格,把各种东西当成资源,然后围绕资源的状态变化来构建 API 接口,包括调用 API 的 HTTP 方法。
由于只是一种接口风格,缺少足够的约束,因为理解不同各种不完全遵守风格用法都可以有。
当然,之前也缺少一些文档工具,现在 Swagger 似乎挺强大,还可以交互。
除此之外, Rest 风格和 HTTP 绑的比较紧,依赖 HTTP 状态码以及 HTTP 请求方法 GET/POST/DELETE/PUT,某些情况可能不适用,比如需要更高性能的 RPC 调用时。
碎碎念
记录一些所思所想,写写科技与人文,写写生活状态,写写读书心得,主要是扯淡和感悟。 欢迎关注,交流。
微信公众号:程序员的诗和远方
公众号ID : MonkeyCoder-Life
以上所述就是小编给大家介绍的《20180715_ARTS_week03》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Series 60 应用程序开发
巴克 / 人民邮电出版社 / 2005-7 / 75.0
Series 60智能手机开发平台正掀起新一轮的移动服务浪潮。超过60%的手机生产商获得了Series 60平台的授权。Series 60移动应用开发平台拥有最大的用户群,从而成为智能手机市场的代表。诺基亚与EMCC软件公司合作,为C++程序员和软件设计师编撰了这本Series 60开发的权威指南。本书由诺基亚资深专家进行了全面审阅。本书内容涉及了开发过程的各个阶段,从设计、编程、测试、调试到部署......一起来看看 《Series 60 应用程序开发》 这本书的介绍吧!