20180715_ARTS_week03

栏目: 服务器 · 发布时间: 6年前

内容简介: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


以上所述就是小编给大家介绍的《20180715_ARTS_week03》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Series 60 应用程序开发

Series 60 应用程序开发

巴克 / 人民邮电出版社 / 2005-7 / 75.0

Series 60智能手机开发平台正掀起新一轮的移动服务浪潮。超过60%的手机生产商获得了Series 60平台的授权。Series 60移动应用开发平台拥有最大的用户群,从而成为智能手机市场的代表。诺基亚与EMCC软件公司合作,为C++程序员和软件设计师编撰了这本Series 60开发的权威指南。本书由诺基亚资深专家进行了全面审阅。本书内容涉及了开发过程的各个阶段,从设计、编程、测试、调试到部署......一起来看看 《Series 60 应用程序开发》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

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

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具