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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

运营笔记

运营笔记

类延昊 / 天津人民版社 / 2016-12-1 / CNY 39.80

运营是入门浅但学问深的行当。一个入门很久的人不见得能在11年内爬到塔尖,同样一个初入龙门的人占据高位也不见得非用11年。 到底该怎么做运营?如何做运营才不至于让自己忙死累死甚至茫然不知所措?如何和用户进行有效沟通?如何把握住处于塔尖20%的核心用户?如何强敌逼阵时快速找到突破口?如何挤破头皮提高转化率? 在这本书里,类类以自己常年战斗在一线摸爬滚打的经验给予了有效而真诚的解答。一起来看看 《运营笔记》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器