算法
文章平均质量分 88
PostgreSQL运维技术
这个作者很懒,什么都没留下…
展开
-
java版找出链表中倒数第K个节点
题目:给定一个单向链表,要求找出该链表中倒数第 k 个节点,要求只能遍历一次链表,且空间复杂度为 O(1)。思路1:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。但是单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通。思路2: 既然不能从尾结点开始遍历这个链表,我们还是要从头结点来。假设整个链表有n个结点,那么倒数第k个结点就是从头结点开始的第n-k+1个结点。所以我们看下先遍历整个链表得到链表的结点个数n。再从头结点开始往后走n-k+1步就可以得到原创 2020-08-31 18:20:56 · 382 阅读 · 0 评论 -
java两个有序的数组的排序
题目:有两个排序的数组A1和A2,内存在A1的末尾有足够的空余空间容纳A2。请写一个函数,把A2的所有数字插入A1中,并且所有的数字是排序的。题目上的条件是内存在A1的末尾有足够的空余空间容纳A2。所以跟归并排序还不太一样。跟上一篇文章的替换空格的解决方案很像。首先计算merged后数组的总长度。声明一个指针indexMerged,指向merged后的数组的末尾。声明两个数组索引指针,分布遍历连个数组,比较值的大小,将较大的值放在indexMerged的位置中,indexMerged指针向前移动一原创 2020-08-28 15:29:11 · 974 阅读 · 0 评论 -
java版替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。这个问题有两种解法:一是我们需要再原来的字符串上做替换。二是创建新的字符串并在新的字符串上替换。对于第一种情况,在原来的字符串上做替换,如果从头到尾扫描字符串,每一次碰到空格字符的时候做替换。由于是把1个字符替换成3个字符,我们必须要把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了。假设字符串的长度是n,对于每个空格字符,.原创 2020-08-27 17:57:40 · 612 阅读 · 0 评论 -
java版二维数组的查找
题目:给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。解题思路:我们可以利用这个二维数组,每一行都从左到右递增,每一个列都从上至下递增的特性,选取从右上角或者左下角的数字开始查找。demo:public class TestDemo { public static void main(String[] args) { int[][] array = { { 1, 2, 8, 9 }, { 2, 4, .原创 2020-08-27 16:08:52 · 485 阅读 · 0 评论 -
java版第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入"abacbcdeff",则输出'd'。要求时间复杂度为O(n)。为了解决这个问题,我们可以定义一个哈希表(外部空间),其键值(key)是字符,而值(Value)是该字符出现的次数。同时我们需要从头开始扫描字符串两次:(1)第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1。(2)第二次扫描是,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个只出现一次的字符就是符合要求的输出。第一次扫描时,在哈希表中更新一个字符原创 2020-08-27 15:38:27 · 297 阅读 · 0 评论 -
递归与栈
参考:https://blog.csdn.net/bobbypollo/article/details/79891556《java数据结构和算法》什么是递归?递归的基本思想:就是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说必须先解决子问题,再基于子问题来解决当前问题。或者换种角度理解:递归解决的是有依赖顺序关系的多个问题。假设问题有如下的依赖.原创 2020-08-21 17:39:37 · 4821 阅读 · 0 评论 -
数据结构之二叉堆
参考:《漫画算法:小灰的算法之旅》二叉堆本质上是一种完全二叉树,它分为两个类型。最大堆和最小堆。最大堆:最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值。最小堆:最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值。二叉堆的根节点叫做堆顶。注:什么是完全二叉树,理解完全二叉树,需要了解什么是满二叉树,一个二叉树的非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。简单地说,满二叉树的每一个分支都是满的。完全二叉树的定义:对于一个有n个节点的原创 2020-08-19 18:06:05 · 195 阅读 · 0 评论 -
数据结构之二叉树
参考:《漫画算法:小灰的算法之旅》二叉树是树的一种特殊形式。这种树的每个节点最多有2个孩子节点。二叉树节点的两个孩子节点,一个被称为左孩子(left child),一个被称为右孩子(right child)。这两个孩子节点的顺序是固定的。二叉树的存储数据结构分为物理结构和逻辑结构。二叉树属于逻辑结构,它可以通过多种物理结构来表达。1、链式存储结构2、数组链式存储:链式存储是二叉树最直观的存储方式。我们知道链表是一对一的存储方式,每个链表节点拥有data变量和一个指向下一个节点的ne原创 2020-08-19 12:29:43 · 1332 阅读 · 0 评论 -
redis实现分布式锁
做分布式锁的思路:用一个全局唯一的资源来满足资源竞争的顺序执行和原子性就行。步骤:1、A先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。但这种做法可能带来的一个问题:在setnx之后执行expire之前进程意外crash或者要重启维护了,导致永远不释放该锁。2、为了避免上面提到的问题。setnx时加上一个时间戳,表示失效时间。SETNX lock.foo <current Unix time + lock timeout + 1>该原创 2020-08-05 15:26:48 · 117 阅读 · 0 评论 -
附近地点搜索解决方案之基于球面距离公式的算法
球面上任意两点之间的距离计算,我们采用Haversine公式。其中R为地球半径,取6371km; φ1, φ2表示两点的纬度; Δλ 表示两点经度的差值。 d就是我们要求的距离用python实现下计算球面两点之间距离的函数:from math import sin, asin, cos, radians, fabs, sqrtEARTH_RADIUS=6371 # 地球平均半径,6371kmdef hav(theta): s = s...原创 2020-06-03 17:48:42 · 552 阅读 · 0 评论 -
由两个栈组成的队列
题目描述用两个栈实现队列,支持队列的基本操作。输入描述:第一行输入一个整数N,表示对队列进行的操作总数。下面N行每行输入一个字符串S,表示操作的种类。如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。如果S为"poll",则表示弹出队列头部操作。如果S为"peek",则表示询问当前队列中头部元素是多少。输出描述:对于每一个为"peek"的操作...原创 2019-08-19 02:29:44 · 162 阅读 · 0 评论 -
空格替换——【一天一道算法题】
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。1、思路:可利用正则实现。匹配字符串中的空格(只匹配一个所以是\s{1}),利用re.sub将匹配的空格,替换为相应的内容。# -*- coding:utf-8 -*-class Solution: # s 源字符串 ...原创 2018-09-04 13:23:46 · 140 阅读 · 0 评论 -
从尾到头打印链表——【一天一道算法题】
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思想:栈的思想# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: # 返回从尾部到头部的列表值序列...原创 2018-09-26 20:13:55 · 140 阅读 · 0 评论 -
MongoDB的一致性——Raft
概述Raft : raft is a consensus algorithm for managing a replicated log.分布式存储系统通常通过维护多个副本来进行容错,提高系统的可用性。要实现此目标,就必须要解决分布式存储系统的最核心问题:维护多个副本的一致性。一致性(consensus): 它是构建具有容错性(fault-tolerant)的分布式系统的基础。 在一个...原创 2018-11-13 17:37:31 · 2647 阅读 · 0 评论 -
一致性哈希与python实现
使用场景问题:假设我们有 5 台 MySQL 服务器,然后对数据库进行水平拆分。应该怎么做?最简单的做法是利用哈希,也就是对于插入表中的数据,我们对记录的 id 进行哈希映射到 0~4 的区间,然后根据哈希结果保存到对应的 MySQL 服务器中。这个方案乍一看问题不大,但是,在不考虑冗余备份的情况下,我们考虑一下如果其中一台数据库宕机了,我们的数据就会因为这种哈希算法而乱掉,我们就需要...原创 2018-12-19 11:52:22 · 1962 阅读 · 1 评论 -
算法:比较版本号大小
java版:class test { public int versionCompare(String version1, String version2) { String[] v1Arr = version1.split("\\."); String[] v2Arr = version2.split("\\."); int i =...原创 2019-04-30 13:42:43 · 3696 阅读 · 0 评论 -
算法:在行列都排好序的矩阵中找指定的数
题目描述给定一个N \times MN×M的整形矩阵matrix和一个整数K, matrix的每一行和每一列都是排好序的。实现一个函数,判断K是否在matrix中[要求]时间复杂度为O(N+M)O(N+M),额外空间复杂度为O(1)O(1)。输入描述:第一行有三个整数N, M, K接下来N行,每行M个整数为输入的矩阵输出描述:若K存在于矩阵中输出"Yes",否...原创 2019-08-19 00:02:35 · 567 阅读 · 0 评论 -
最长的可整合子数组的长度
题目描述先给出可整合数组的定义:如果一个数组在排序之后,每相邻两个数的差的绝对值都为1,或者该数组长度为1,则该数组为可整合数组。例如,[5, 3, 4, 6, 2]排序后为[2, 3, 4, 5, 6],符合每相邻两个数差的绝对值都为1,所以这个数组为可整合数组给定一个数组arr, 请返回其中最大可整合子数组的长度。例如,[5, 5, 3, 2, 6, 4, 3]的最大可整合子数组为[5...原创 2019-08-19 00:36:39 · 522 阅读 · 0 评论 -
不重复打印排序数组中相加和为给定值的所有二元组
题目描述给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:1, 92, 8[要求]时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)输入描述:第一行有两个整数n, k接下来一行有n个整数表示数组内的元素输出描述:...原创 2019-08-19 01:08:02 · 428 阅读 · 0 评论 -
二维数组的查找——【一天一道算法题】
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1、思路:一行一行的查找(可使用二分查找)。# -*- coding:utf-8 -*-class Solution: # array 二维列表 def Find(self, ta...原创 2018-09-04 10:10:23 · 161 阅读 · 0 评论