第一章 序章
关于LeetCode
LeetCode主要是用在面试中,在有限的时间内考验小镇做题家的算法能力
关于作者
万和晧是读研时的舍友,互相监督刷题卷一下嘿嘿
编程语言
万擅长用java, 晧用c++各写一遍
根据时间复杂度的不同,大致分为3类:
c++:
1 | void quicksort(vector<int> &nums, int l ,int r) { |
java:
1 | @houwanwan |
二分查找通常将待查找区间分为两部分并只取一部分继续查找,可以大大减少查找的复杂度。
给定一个非负整数,求它的开方,向下取整。
输入是一个整数,输出一个整数。
1 | Input: 8 |
c++:
1 | int mySqrt(int a) { |
java:
1 | //注意int强转long的用法 |
给定一个增序的整数数组和一个值,查找该值第一次和最后一次出现的位置。
输入是一个数组和一个值,输出为该值第一次出现的位置和最后一次出现的位置(从0开始);如果不存在该值,则两个返回值都设为-1。
1 | Input: nums = [5,7,7,8,8,10], target = 8 |
c++:
1 | vector<int> searchRange(vector<int>& nums, int target) { |
java:
1 | //拆解为两个二分查找,注意收敛边界 |
一个原本增序的数组被首尾相连后按某个位置断开(如[1,2,2,3,4,5]->[2,3,4,5,1,2],在第一位和第二位断开),我们称其为旋转数组。给定一个值,判断这个值是否存在于这个为旋转数组中。
输入是一个数组和一个值,输出是一个布尔值,表示数组中是否存在于这个旋转数组中。
1 | Input: nums = [2,5,6,0,0,1,2], target = 0 |
c++:
1 | bool search(vector<int>& nums, int target) { |
java:
1 | //注意区分有序空间 |
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。
在一个增序的整数数组里找到两个数,使它们的和为给定值。已知有且只有一对解。
输入是一个数组和一个给定值。输出是两个数的位置,从1开始计数。
1 | Input: numbers = [2, 7, 11, 15], target = 9 |
c++:
1 | vector<int> twoSum(vector<int>& numbers, int target) { |
java:
1 | class Solution { |
给定两个有序数组,把两个合并成一个。
输入是两个数组和他们分别的长度m和n。其中第一个数组的长度被延长至m+n,多出的n位被0填充。题目要求把第二个数组归并到第一个数组上,不需要开辟额外空间。
1 | Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2, 5, 6], n = 3 |
c++:
1 | void merge(vector<int>& nums1, vector<int>& nums2, int m, int n) { |
java:
1 | class Solution { |
给定一个链表,如果有环路,找出环路的开始点。
输入是一个链表,输出是链表的一个节点,如果没有环路,返回一个空指针。
链表数据结构:
1 | struct ListNode { |
c++:
1 | ListNode *detectCycle(ListNode *head) { |
java:
1 | /** |
给定两个字符串S和T,求S中包含T所有字符的最短连续子字符串的长度, 同时要求时间复杂度不得超过O(n)。
输入是两个字符串S和T,输出是一个S字符串的子串。
1 | Input: S = "ADOBECODEBANC", T = "ABC" |
java:
1 | class Solution { |
对于快速迭代的软件开发,会导致软件文档中的API不能及时更新,不同项目组之间的代码协同问题出现了较大的挑战,因此本文简单实验springboot集成swagger动态生成文档,可以边开发代码边生成文档,由于springfox版本老旧已经不在维护,本文使用springdoc方式集成。
如果已经搭建好了springboot项目可以跳过这一步
点击左上角菜单New,选择Project
使用Spring Initializr方式创建springboot项目,选择jdk为本地安装的1.8版本,点击下一步
日志对于排查错误非常重要,使用linux命令awk sed grep find等命令查询日志非常麻烦,而且很难做数据分析,使用免费开源的ELK可以支撑大规模的日志检索,本文将一步步教怎么快速搭建一个window版本的ELK日志收集系统。
注意同一系列的版本要一样,防止出现版本不兼容问题,本文使用7.16.0版本,在window系统演示
访问地址为:https://www.elastic.co/cn/downloads/past-releases
点击Donload下载
贪心算法采用贪心的策略,保证每步都是局部最优,最终达到全局最优
455.Assign Cookies (Easy)
有一群孩子和一堆饼干,每个孩子都有一个饥饿度,每个饼干都有一个大小,每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。
输入两个数组,分别代表孩子们的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数量。
1 | Input: [1, 2], [1, 2, 3] |
c++:
1 | int findContentChildren(vector<int>& children, vector<int>& cookies) { |
java:
1 | class Solution { |
作为java开发工程师,大家都知道源码中有很多naive方法,这些方法看不到源码,底层jdk源码使用c语言编写。Oracle Jdk是闭源的看不到源码,OpenJdk是Oracle Jdk的开源版本,据说,两者代码基本一致。因此本篇博客给大家介绍如何使用clion编译器调试openjdk源码。
整个过程还是遇到了各种各样的困难,为了使广大读者少走弯路,将编译通过的经验总结在这个帖子,希望大家多多指教。
为了能够更好的复现结果,防止因环境或者其他原因导致编译失败,先请大家一步一步跟着我的步骤执行。
所需软件(可以自行在官网下载)
链接:https://pan.baidu.com/s/1ppPLww7cp32vCdFvchbTEg
提取码:35hc
1 | 对于window环境的读者可以安装虚拟,在虚机的环境下安装ubuntu1604系统。如果已经是ubuntu1604系统则忽 |