刷题
真心乖宝宝
这个作者很懒,什么都没留下…
展开
-
二维数组按数字大小选取前top k个数字
题目描述二维数组,每行是降序的,且每行的长度不固定,综合选取去重后的前top-k大的数字。输入:[[10,9,7,5,2][8,6,3][10,9,8,5]]选取前top-5大的数字输出:[10,9,8,7,6]做法思想选取top-k大(小)这种问题,首先想到用最大(小)堆解决,本题中考虑构建k个最大堆进行比较,若某个堆顶元素被选取了,则将指针往后移。具体代码import heapqdef run(nums, k): m = len(nums) list1 = [0原创 2022-05-25 15:45:17 · 652 阅读 · 0 评论 -
【力扣第九题】-- 回文数(python版本)
题目描述判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。题目解析本题可以考虑使用两种方法:第一种方法是直接将整数的前半部分与后半部分比较是否一样,若相同,则为回文数;原创 2021-01-27 15:24:42 · 512 阅读 · 3 评论 -
【力扣第八题】-- 字符串转换整数(python版本)
题目描述请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数(类似 C/C++ 中的 atoi 函数)示例1:输入: str = “42”输出: 42示例2:输入: str = " -42"输出: -42解释: 第一个非空白字符为 ‘-’, 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42.示例3:输入: str = “4193 with words”输出: 4193解释: 转换截止于数字 ‘3’ ,因为原创 2021-01-23 18:15:43 · 236 阅读 · 0 评论 -
【力扣第七题】-- 整数反转(python版本)
题目描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21思路解析用 res 变量记录反转的整数数字,对当前数字取对 10 的余数,再将余数与 res 变量加和,即可完成 数字 翻转;int 取值范围为 [-2^(31), 2^(31) - 1],如果翻转数字溢出,则立即返回 0。具体代码def reverse(x): # 将原创 2020-12-29 11:57:00 · 322 阅读 · 2 评论 -
【力扣第六题】-- Z字形变换(python版本)
题目描述将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。思路解析字符串 s 是以 Z 字形为顺序存储的字符串,按顺序遍历字符串 s 时,每个字符 c 在 Z 字形中对应的行索引先增大再减小;解决思原创 2020-12-28 16:59:19 · 630 阅读 · 5 评论 -
【力扣第五题】-- 最长回文子串(python版本)
题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”解题思路本题考虑使用动态规划求解,有以下两种情况需要考虑:(1) 如果一个字符串是回文串,那么在它左右分别加上一个相同的字符,那么它一定还是一个回文串;(2) 如果在一个不是回文字符串的字符串两端添加任何字符,或者在回文串左右分别加不同的字符,得到的一定原创 2020-12-26 17:13:58 · 344 阅读 · 0 评论 -
【力扣第三题】-- 无重复字符的最长子串(python版本)
题目描述给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。注意,你的答案必须是子串的长度,"pwke"是一个子序列,不是子串。题目解析本题考虑使用双指针滑动窗口计算最长子串的长度,利用集合的无重复性来存储滑动窗口的字符具体代码原创 2020-12-22 17:14:27 · 279 阅读 · 1 评论 -
【力扣第二题】--两数相加(python版本)
题目描述给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以0开头。示例:输入:(7 -> 4 -> 3) + (5 -> 6 -> 4)输出:2 -> 1 -> 8原因:347 + 465 = 812具体代码class ListNode(object): de原创 2020-12-21 21:22:22 · 999 阅读 · 2 评论 -
【力扣第一题】--两数之和(python版本)
题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1]具体代码def twoSum(nums, target): for i, j in enumerate(nums): chazhi = target - j原创 2020-12-17 11:16:08 · 301 阅读 · 0 评论 -
【剑指第6题】从尾到头打印链表(自己输入链表) python
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)示例1输入:head = [1, 3, 2]输出:[2, 3, 1]class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution: def reversePrint(self, head): # # 法一 利用栈 # stack =原创 2020-08-17 19:40:57 · 149 阅读 · 0 评论 -
一组数的最大公约数和最小公倍数 python
最大公约数利用辗转相除法求得# 两个数的最大公约数def gcd_2(a,b): if a < b: a,b = b,a if a % b == 0: return b else: return gcd_2(b, a%b)# 多个数的最大公约数def gcd_many(list1): g = list1[0] for i in range(1, len(list1)): g = gcd_2原创 2020-08-12 13:03:06 · 314 阅读 · 0 评论 -
记录leetcode392:判断子序列
题目描述给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(如,"ace"是"abcde"的一个子序列,而"aec"不是)样例示例 1:s = “abc”, t = “ahbgdc”返回 true.示例 2:s = “axc”, t =原创 2020-07-27 11:42:02 · 83 阅读 · 0 评论 -
【赛码网 牛客网】笔试 --> 输入输出写法 python版本
2020秋招陆续开始了。。。找研发岗工作的学生党也陆续开始做各大公司的笔试题了。。。然而曾经在力扣牛客等网站刷题时,我从未考虑过代码的输入与输出问题。。。在首次笔试遇到白板题,代码写对了,但是输入输出不知如何写,真的是坑爹啊,特此记录一下。。。这里以一例题为例,题目来源于赛码网上一道题题目题目描述大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,原创 2020-07-22 22:37:15 · 3777 阅读 · 6 评论 -
如何判断有向图有环 --> 拓扑排序
拓扑排序在图论中,拓扑排序是一个有向无环图的所有顶点的线性序列。且该序列必须满足下面两个条件:1.每个顶点出现且只出现一次2.若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说如何判断有向图有环1.从DAG图中选择一个没有前驱(即入度为0)的顶点并输出。2.从图中删除该顶点和所有以它为起点的有向边。3.重复1和2直到当前的DAG图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。得原创 2020-07-21 22:02:12 · 4563 阅读 · 2 评论 -
图的遍历:广度优先搜索和深度优先搜索
图的遍历从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search)广度优先搜索(BFS)广度优先搜索类似于二叉树的层序遍历。它的基本思想就是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,…,wi,然后再依次访问w1,w2,…,wi的所有未被访问过的邻接顶点,直到图中所有顶点都被访问过为止。深度优先搜索(DFS)深原创 2020-07-21 17:52:11 · 578 阅读 · 0 评论 -
列表实现栈--剑指offer:用两个栈实现队列
栈栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端进行加入数据(push)和输出数据(pop);由于栈只允许在一端进行操作,因而按照先进后出(LIFO, Last In First Out)的原理运作队列队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表;队列是一种先进先出(FIFO, First in First Out)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头题目描述用两原创 2020-06-09 20:55:33 · 104 阅读 · 0 评论 -
递归解决--剑指offer:重建二叉树(python版本)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回思路解析二叉树的遍历考虑使用递归,前序遍历顺序为根节点–左节点–右节点,中序遍历顺序为左节点–根节点–右节点根据前序遍历的第一个节点(根节点),在中序遍历找到根节点的索引位置,确定左右子树,对左右子树使用递归,直到到达叶子节点具体代码class So原创 2020-06-09 16:46:15 · 114 阅读 · 0 评论 -
三种方法--剑指offer:从尾到头打印链表(python实现)
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList思路解析有三种方法实现:(1) 直接将链表的值依次插入列表的第0个位置,实现倒序(2) 遍历是从头到尾,返回是从尾到头,典型的先进后出,考虑使用栈和递归实现 (使用栈)(3) 使用递归具体代码## 法一 将链表的值依次直接插入列表的第一个位置,实现倒序class Solution: def printListFromTailToHead(self, listNode): # write原创 2020-06-08 19:59:15 · 243 阅读 · 0 评论 -
三种方法--剑指offer:二维数组中的查找(python实现)
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路可以用三种方法求解:()...原创 2020-06-08 09:14:25 · 260 阅读 · 0 评论 -
【排序】leetcode--第451题--根据字符出现频率排序--(python版)
题目描述给定一个字符串,请将字符串里的字符按照出现的频率降序排列示例 :输入:“tree”输出:“eert”解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。解题思路按照字符出现的频数进行排序,频数统计使用字典储存,可以考虑使用以下三种方法求解:(1) 调用python自带的sort函数,对字符频数进行排序(2) 利用桶排序,将字符频数相同的字符放进一个桶里,按频数大小,依次将桶里数据读取出来原创 2020-05-15 10:56:16 · 686 阅读 · 0 评论 -
十大排序算法--基数排序(python版)
基本思想基数排序的总体思路就是将待排序数据拆分成多个关键字进行排序,也就是说,基数排序的实质是多关键字排序比如说成绩的排序,如果两个人总分相同,则语文高的排在前面,语文成绩也相同则数学高的排在前面如果对数字进行排序,那么个位、十位、百位就是不同优先级的关键字操作步骤(1) 取得数组中的最大数,并取得位数(2) 建立桶数组(3) 按位数的大小分别装进不同的桶里(4) 将原数组清空,将各个桶里的数据依次添加进原列表(5) 再进行前一位的排序,依次循环,直到排序的位数大于最大值的位原创 2020-05-12 11:25:28 · 245 阅读 · 0 评论 -
十大排序算法--桶排序(python版)
基本思想把数组a划分为n个大小相同子区间(桶),每个子区间各自排序,最后合并。桶排序要求数据的分布必须均匀,不然可能会失效。计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况算法描述(1) 设置一个定量的数组当作空桶(2) 遍历输入数据,并且把数据一个一个放到对应的桶里去(3) 对每个不是空的桶进行排序(4) 从不是空的桶里把排好序的数据拼接起来代码def bucket_sort(alist): min_num = min(alist)原创 2020-05-12 10:27:39 · 269 阅读 · 1 评论 -
十大排序算法--计数排序(python版)
定义计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数基本思想对每一个输入的元素a[i],确定小于 a[i] 的元素个数。所以可以直接把 a[i] 放到它输出数组中的位置上。假设有5个数小于 a[i],所以 a[i] 应该放在数组的第6个位置上代码def count_sort(alist): # 找到最大最小值 min_num = min(alist) max_num =原创 2020-05-12 09:05:58 · 249 阅读 · 0 评论 -
十大排序算法--归并排序(python版)
定义归并排序(mergesort)是创建在归并操作上的一种有效的排序算法该算法是采用分治法的一个非常典型的应用分治法:分割:递归地把当前序列平均分割成两半集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)代码def merge_sort(alist): if len(alist) < 2: return alist # 将列表分成更小的两个列表 mid = int(len(alist)/2) # 分别对左右两个列表进行处理原创 2020-05-11 23:17:32 · 164 阅读 · 0 评论 -
十大排序算法--选择排序:(2)堆排序(python版)
定义堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。堆排序步骤堆可以分为大根堆和小根堆,这里用最大堆的情况来定义操作:(1) 最大堆调整(max_heap)(2) 建立最大堆(build_max_heap)(3) 堆排序(heap_sort)堆节点位置在阵列起始位置为0的情况:(1) 父节点 i原创 2020-05-11 22:34:12 · 172 阅读 · 0 评论 -
十大排序算法--选择排序:(1)简单选择排序(python版)
思路选择排序是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。代码def select_sort(alist): n = len(alist) for i in range(n): # 设置索引 i为最小值的索引 min_idx = i # 通过比较,不断调整最小值的索引位置原创 2020-05-11 15:50:11 · 107 阅读 · 0 评论 -
十大排序算法--插入排序:(2)希尔排序(python版)
思路希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。代码def shell_sort(alist): n = len(alist) # 将数组一共分为 gap列 gap = n // 2 while gap >= 1: # 从第二行开始,对每一列进行原创 2020-05-11 15:24:09 · 119 阅读 · 0 评论 -
十大排序算法--插入排序:(1)简单插入排序(python版)
思路插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入代码def insert_sort(alist): length = len(alist) for i in range(1,length): for j in range(i, 0, -1): if alist[j] < alist[j - 1]: alist[j], al原创 2020-05-11 12:12:01 · 161 阅读 · 0 评论 -
十大排序算法--交换排序:(2)快速排序(python版)
思路在一个数据集中取个数作为参考点,大于该数的元素放在其右边;小于该数的元素放在其左边。这样就将数据集分成两部分,大于参考值部分和小于参考值部分,递归该过程,直到序列中所有记录均有序。步骤挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。原创 2020-05-11 11:06:50 · 278 阅读 · 0 评论 -
十大排序算法--交换排序:(1)冒泡排序(python版)
详解简单来说,就是两两比较冒泡排序是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。代码def bubbleSort(arr): n = len(arr) # n-1的原因是:若列表为6个元素,两两比较,则只需要比较5次 for i in range(n-1): #原创 2020-05-11 10:06:22 · 224 阅读 · 0 评论 -
【双指针】--leetcode(524)--通过删除字母匹配到字典里最长单词
题目描述给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。示例1:输入:s = “abpcplea”, d = [“ale”,“apple”,“monkey”,“plea”]输出:“apple”示例2:输入:s = “abpcplea”, d = [“a”,“b”,“c”]输出:“a”解题思路首先将字符串字典按照字母长度和字典顺原创 2020-05-09 11:18:17 · 125 阅读 · 0 评论 -
【双指针】--leetcode(141)--给定一个链表,判断链表中是否有环(python版)
题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环思路解析使用快慢指针进行判断,若该链表存在环,则快慢指针必会相遇,若该链表不存在环,则快指针必会先达到链表的尾部且指向None具体代码class Solution(object): def hasCycle(self, head): """ :type head: L原创 2020-05-09 09:49:01 · 498 阅读 · 4 评论 -
【双指针】--leetcode(680)--验证回文字符串2(python版)
题目描述:给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: “aba”输出: True示例 2:输入: “abca”输出: True解释: 你可以删除c字符。思路解析:从题目中可以看出,需要比较字符串的前后字符是否一样,可以考虑使用双指针,一前一后同时进行,时间复杂度为o(n)具体代码:class Solution(object): def validPalindrome(self, s): """原创 2020-05-08 21:09:29 · 178 阅读 · 0 评论 -
剑指offer--二叉树--按之字形顺序打印二叉树(python实现)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。...原创 2020-04-28 23:07:52 · 375 阅读 · 1 评论 -
剑指offer--链表--删除链表中重复的结点(python实现)
class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplication(self, pHead): # write code here # 若该链表为空或者只...原创 2020-04-28 15:40:30 · 173 阅读 · 0 评论