All

两个数组的交集II-LeetCode350
2019 年 08 月 07 日

题目描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = \[1,2,2,1], nums2 = \[2,2]
输出: \[2,2]

示例 2:

输入: nums1 = \[4,9,5], nums2 = \[9,4,9,8,4]
输出: \[4,9]

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序。

*进阶:*

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

这个题目的T349的进阶版。

有效的括号—LeetCode20
2019 年 08 月 07 日

题目描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = \[1,2,2,1], nums2 = \[2,2]
输出: \[2]

示例 2:

输入: nums1 = \[4,9,5], nums2 = \[9,4,9,8,4]
输出: \[9,4]

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。
有效的括号—LeetCode20
2019 年 08 月 07 日

题目描述

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。 有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1:
输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

 输入: "(\[)]"
 输出: false

示例 5:

输入: "{\[]}"
输出: true

这个题目与我们编译器对括号的识别一样,当我们多了一个括号后编译器会报错提示。

保持城市的天际线-LeetCode807
2019 年 08 月 06 日

题目描述

在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度。 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。

最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。 城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。

建筑物高度可以增加的最大总和是多少?

例子: 输入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]] 输出: 35 解释: The grid is: [ [3, 0, 8, 4], [2, 4, 5, 7], [9, 2, 6, 3], [0, 3, 1, 0] ]

从数组竖直方向(即顶部,底部)看“天际线”是:[9, 4, 8, 7] 从水平水平方向(即左侧,右侧)看“天际线”是:[8, 7, 9, 3]

在不影响天际线的情况下对建筑物进行增高后,新数组如下:

gridNew = [ [8, 4, 8, 7], [7, 4, 7, 7], [9, 4, 8, 7], [3, 3, 3, 3] ] 说明:

1 < grid.length = grid[0].length <= 50。 grid[i][j] 的高度范围是: [0, 100]。 一座建筑物占据一个grid[i][j]:换言之,它们是 1 x 1 x grid[i][j] 的长方体。

这个问题类似看三视图,然后再根据两个三视图合并出符合条件的最高值。

最后要返回的结果是这个最高值比原有值增长了多少

手写rpc简单实现
2019 年 07 月 26 日

背景

当单体项目逐渐扩大后,一个项目编译,发布可能需要很久的时间,如果其中一个文件出现 bug,那么需要对整个项目进行打包发布。微服务就是对项目进行拆分,拆分成多个小项目,由这些小项目组成大项目。并且拆分成小项目后,其他单体项目中需要相同功能的地方就不用再次编写,直接用这个就可以了。有种分治的思想。

那么原来单体项目拆分后,随之而来就会出现一些问题。原来一个项目中直接调用即可,现在请求的类被拆分到其他项目中,如何进行请求,是采用 http 这种请求还是rpc?多个模块如果进行管理等等一系列问题。这里主要写一下 rpc 的理解。

在微服务中rpc又是重要的一环,现在主流的rpc框架有很多,比如阿里的dubbo,微博的Motan,谷歌的gRpc,还有Thrift,现在主流的应该就这几种吧。按照文档学习了一下dubbo如何使用后,发现并没有了解rpc是如何具体实现的。所以这篇文章记录了自己对rpc的一些理解与实战代码。

代码链接

HTTP 与 RPC 的对比

其实就像一些技术一样,没有绝对好的技术,不然大家都去使用它了。都只是在不同场景下有各自的优势。

  • rpc一般是自带负载均衡策略,而 http 一般是通过 nginx 这种来实现负载均衡
  • rpc可以使用 tcp 协议也可以使用 http 协议,而 http 就只能使用 http 协议
  • rpc可以自定义传输信息和序列化方法,减少传输报文大小。

所以RPC主要用于公司内部的服务调用。HTTP主要用于对外的环境,浏览器接口调用,APP接口调用,第三方接口调用等。

RPC的主要实现步骤

RPC调用流程

题目描述

我们把符合下列属性的数组 A 称作山脉:

A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1] 给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1] 的 i 的值。

示例 1:

输入:[0,1,0] 输出:1 示例 2:

输入:[0,2,1,0] 输出:1

提示:

3 <= A.length <= 10000 0 <= A[i] <= 10^6 A 是如上定义的山脉

其实这就是一个寻找数组最大值的问题

键盘行-LeetCode500
2019 年 07 月 15 日

题目描述

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。

示例:

输入: [“Hello”, “Alaska”, “Dad”, “Peace”] 输出: [“Alaska”, “Dad”]

注意:

你可以重复使用键盘上同一字符。 你可以假设输入的字符串将只包含字母。

判断给出的字符是否全部在一行中

题目描述

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: “Let’s take LeetCode contest” 输出: “s’teL ekat edoCteeL tsetnoc” 注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

根据示例可以看出,需要将每个单词反转后再根据原有顺序拼接起来

反转字符串-LeetCode344
2019 年 07 月 10 日