6 前路无畏

尚未进行身份认证

我要认证

自律的艰辛总甜过懊悔的苦果!

等级
TA的排名 28w+

设计模式-七大原则:原理背后的原理

23中设计模式,是前任的经验总结,但是在这个原理的背后,还有原理在支撑,他们就是下面要介绍的7大原则,明白了这些原则,非常有用 a.面试时经常被问到。b.有助于对设计模式的学习。c.有助于自己的设计思想的养成与训练。单一职责原则一个类或者一个接口仅做一件事、或者一类事。接口隔离原则我业务类不应该依赖不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上,也就是倒逼我们的接口一定一定要建的颗粒度够小,如果我用到了多个接口的功能,那就实现多个就可以,别懒省事,把方法都写在一个接口中。

2020-10-27 22:21:22

设计模式-行为型-观察者模式-史上最通俗的方式让你明白

1.需求提出1. 中央气象局需要设计一个系统,对外提供sdk接口,是的想百度、新浪、等等第三方的网站可以实时感知到中央气象局传感器实时(每5秒钟想中心系统回报一次温度、湿度信息)获取的温度、湿度等信息2. 特别注意,这些接入的第三方不去定都有谁,谁想象如就可以接入,比如你自己开发一个网站想引流,你可以对接中央气象局的气象接口,为大众提供天气展示服务,再比如想在的墨迹天气等也是对接的类似这种中央气象台的借口。3. 如果中央气象台天气情况发生变化的时候就(主动)通过推送的方式更新各接入第三方的天气信息。

2020-10-27 22:03:19

算法025:用两个栈实现队列,支持队列的基本操作(add、poll、peek)

题目:用两个栈实现队列,支持队列的基本操作(add、poll、peek)。add:添加poll:头部弹出(且删除)peek:查看首元素 思路:使用两个栈,分别为 StackPush 和 StackPop1. 数据1,2,3,4,5,线一次压入StackPush,从定到底:5,4,3,2,1,,2. 然后一到手进入StackPop 就实现了queue:1,2,3,4,5,先进先出1.代码如下TwoStacksQueue.java和TwoStacksQueueTest.java:

2020-10-26 19:47:31

算法024:计一个有getMin功能的栈-实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

题目:设计一个有getMin功能的栈 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。入栈 3、4、5、1、2、1 要求: 1.pop、push、getMin操作的时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。 思路:使用两个栈,一个数据,一个放最小值(顶最小)1.代码如下MyStack.java和MyStackTest.java:package com.yuhl.right.leetcode;import java.util

2020-10-26 08:38:44

算法023:阶乘尾数0的个数-设计一个算法,算出 n 阶乘有多少个尾随零。

题目: 阶乘尾数 设计一个算法,算出 n 阶乘有多少个尾随零。 示例 1: 输入: 3 输出: 0 解释:3! = 6, 尾数中没有零。 示例2: 输入: 5 输出: 1 解释:5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为O(logn)。 思路:详见代码注释1.代码如下TrailingZeroes.java:package com.yuhl.right.leetcode;/** * @author yuhl * @Date 20

2020-10-26 08:38:20

算法022:翻转单词顺序-输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student. “,则输出“stude

题目:翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。示例 1:输入: "the sky is blue"输出:"blue is sky the"示例 2:输入: " hello world! "输出:"world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入

2020-10-26 08:37:55

算法021:字符串压缩:利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串

题目:字符串压缩:利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。 示例1: 输入:"aabcccccaaa" 输出:"a2b1c5a3" 示例2: 输入:"abbccd" 输出:"abbccd" 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。 提示: 字符串长度在[0, 50

2020-10-26 08:37:37

算法020:回文排列-判断给定字符串是否为回文排列

题目: 回文排列 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。 回文串不一定是字典当中的单词。 示例1: 输入:"tactcoa" 输出:true(排列有"tacocat"、"atcocta",等等) 思路:最多有一个字符只出现一次,其他字符均需要出现两次。否则就饭后false。先排序,比较吗? 使用快排的方式。1.代码如下CanPermutePalindrome .java:package

2020-10-26 08:37:12

算法019:字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

题目: 字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。 示例1: 输入:s1 = "waterbottle", s2 = "erbottlewat" 输出:True 示例2: 输入:s1 = "aa", s2 = "aba" 输出:False 提示: 字符串长度在[0, 100000]范围内。 说明: 你能只调用一次检查子串的方法吗? 思路:旋转的化,考虑s2+s2

2020-10-25 08:37:22

算法018:按摩师想挣最多钱-一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优解

题目: 按摩师想挣最多钱 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。 示例 1: 输入: [1,2,3,1] 输出: 4 解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。 示例 2: 输入: [2,7,9,3,1] 输出: 12 解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 =

2020-10-25 08:09:49

算法017:三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

题目: 三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。 示例1: 输入:n = 3 输出:4 说明: 有四种走法 示例2: 输入:n = 5 输出:13 提示: n范围在[1, 1000000]之间 思路:动态规划:n 阶可以往前退一步,可以时n-1阶所有情况之和+可以时n-2阶所有情况之和+可以时n-3阶所有情况之和1.代码如下 Way

2020-10-25 07:57:09

算法016:连续子数组的最大和-输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

题目: 连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 提示: 1 <=arr.length <= 10^5 -100 <= arr[i] <= 100思路:使用动态规划 dp[i] 标识以i结尾的数组和最大的值。1

2020-10-25 07:51:11

算法015:井字游戏-设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符“ “,“X“和“O“组成,其中字符“ “代表一个空位。

题目: 井字游戏设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ","X"和"O"组成,其中字符" "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" ")中。第一个玩家总是放字符"O",且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符

2020-10-25 07:45:22

算法014:判定字符串中字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

题目: 判定字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s = "leetcode" 输出: false 示例 2: 输入: s = "abc" 输出: true 限制: 0 <= len(s) <= 100 如果你不使用额外的数据结构,会很加分。 思路:可以使用二进制位记录,这样效率比较高1.代码如下 IsUnique.java:package com.yuhl.right.leetcode;/*

2020-10-25 07:36:14

算法013:二维数组中的查找-在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断中是否存在

题目: 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target=5,返回t

2020-10-25 07:29:31

算法012:数组中的主要元素:数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。

题目: 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。 示例 1: 输入:[1,2,5,9,5,9,5,5,5] 输出:5 示例 2: 输入:[3,2] 输出:-1 示例 3: 输入:[2,2,1,1,1,2,2] 输出:2 说明: 你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗? 思路:使用投票算法,主要元素的对立面就是非主要元素,把它们看成一撮就可以了,就是肉搏法。1.代码如下 Majority

2020-10-25 07:21:09

算法011: 0~n-1中缺失的数字

题目:剑指 Offer 53 - II. 0~n-1中缺失的数字一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000 思路:使用二分查找,index和velue不一致为需要找到的值1.代码如下 Missi

2020-10-25 07:12:59

算法010:数组中的所有元素是先递增后递减(双调数组) 查找给定的值

题目:所谓双调查找 : 就是在一个数组中的所有元素是先递增后递减的,则这个数组被称为双调的。以a数组为例 :{1,2,3,5,8,9,6,4,-1,-9}; 思路:1. 既然是有序的,自然想到的是二分搜索2. 但是与普通的二分搜索不一样,不知道拐点在何处3. 所以大致分为三种情况:① a[mid] 在 左半边但未越过拐点② a[mid] 在右半边越过了拐点③ a[mid]刚好在拐点所以可以分为以上三种情况进行递归查找1.代码如下 Shuangdiao .java:package

2020-10-25 00:07:56

算法009:金字塔打印问题,特别注意空格

题目:金字塔打印,三角形 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 思路:注意空格1.代码如下 Pyramid .java:package com.yuhl.right;/** * @author yuhl * @Date 2020/10/24 23:15 *

2020-10-24 23:54:30

算法008:LRU算法实现:双向链表+HashMap 实现LRU算法,不允许用LinkedHashMap

题目:LRUTest:Least Recently Used get putpot ,get方法的书写LRU算法实现:双向链表+HashMap 实现LRU算法,不允许用LinkedHashMap思路:热点元素在前,冷元素在后,会被淘汰掉1.代码如下 BinSearch2 .java:1.1LRU.java:package com.yuhl;import java.util.HashMap;/** * @author yuhl * @Date 2020/10/24 22:43

2020-10-24 23:10:34

查看更多

勋章 我的勋章
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。