自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 收藏
  • 关注

原创 leetcode #328. 奇偶链表

题目:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。代码:if not head: return None single = head double = head.next double_head = head.next

2021-01-17 23:08:27 63

原创 leetcode #725. 分隔链表

题目:给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。返回一个符合上述规则的链表的列表。举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]思路:1、先遍历链表,计算长度n2、用n

2021-01-17 16:41:16 108

原创 leetcode#24. 两两交换链表中的节点

题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。代码:class Solution: def swapPairs(self, head: ListNode) -> ListNode: newhead = ListNode(0) newhead.next = head p = newhead while p.next and p.next.nex

2021-01-14 22:45:26 63

原创 19. 删除链表的倒数第N个节点

题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。代码:1、先记录链表的长度l,然后将链表前进l-n步,进行操作。注意分情况讨论l-n>1;=1=0的情况:class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: lenth = 0 p = head while p: lenth +=

2021-01-14 20:45:41 56

原创 剑指 Offer 06. 从尾到头打印链表

题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。代码:1、先把整个链表反转,再遍历,放入anslist中class Solution: def reversePrint(self, head: ListNode) -> List[int]: pre,cur = None,head while cur: tmp = cur.next cur.next = pre

2021-01-13 21:34:58 50

原创 剑指 Offer 18. 删除链表的节点

题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。代码:1、单独判断头结点:class Solution: def deleteNode(self, head: ListNode, val: int) -> ListNode: p = head if p.val == val: return p.next while p: if p.nex

2021-01-13 15:44:32 48

原创 leetcode #318. 最大单词长度乘积

题目描述:给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。思路:有两种思路:1、常规解法,先写一个辅助函数用来判断两个字符是否有相同的字母,如果没有,就计算他们的长度的乘积,维护一个数字ans,如果大于ans就更新2、遍历一个字符串,记录每一个字母与’a‘的距离,比如c,与’a’距离为2,然后将1左移距离位,即 n = 1<&

2020-12-15 21:32:52 167

原创 leetcode #260. 只出现一次的数字 III

题目描述:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。思路:1、所有的数字做^,就能把只出现两次的那两个数字不一样的位数显示出来,因为a ^ a = 02、a & (-a) 能保留最后一位a不为0的1,剩下的全都归零代码:class Solution: def singleNumber(self, nums: List[int]) -> List[int]: bitmask = reduce

2020-12-02 13:52:42 71

原创 leetcode $268. 丢失的数字

题目描述:给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?思路:索引值:0,1,2,3,4值 :0,1,2,4,5如果把最后一个值5加上,然后互相异或,则可得到最终的值代码:1、class Solution: def missingNumber(self, nums: List[int]) -> int: sum

2020-12-01 22:21:05 118

原创 leetcode #136. 只出现一次的数字

题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?思路:1、任何数和 0 做异或运算,结果仍然是原来的数,即 a^0=a。2、任何数和其自身做异或运算,结果是 0,即a^a=0。3、异或运算满足交换律和结合律代码:class Solution: def singleNumber(self, nums: List[int]) -> int:

2020-12-01 20:56:45 65

原创 leetcode #剑指 Offer 15. 二进制中1的个数

题目描述:请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。思路:思路一:如果n不为0 ,n&1,如果为1,则ans+1,然后n>>=1思路二:n-1 表示的是n的最后一个1变成0,剩下的位数变成1,如10100-1=10011那么n&n-1,就是去掉一个1,如10100&10011=10000代码:思路一:class Sol

2020-11-27 21:29:03 132

原创 leetcode #565. 数组嵌套

题目描述:索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]… 以此类推,不断添加直到S出现重复的元素。思路:1、可以发现,所有符合的元素都可以构成一个环,无论从哪个元素开始,最终都会回到这个元素;2、构建一个辅助队列,如果已经用到这个元素的话,标记一

2020-11-27 15:07:53 158

原创 leetcode #769. 最多能完成排序的块

题目描述:数组arr是[0, 1, …, arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。思路:遍历数组,如果区间最大值与索引值相同,则可以单独划分一个切片代码:class Solution: def maxChunksToSorted(self, arr: List[int]) -> int: ans = 0 for i in range(le

2020-11-26 23:03:30 122

原创 leetcode #766. 托普利茨矩阵

题目描述:如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。思路:对角线上的元素:(1,1)、(2,2)、(3,3),或者(2,1)、(3,2),即:每次横坐标加一,纵坐标加一,判断是否变化即可代码:class Solution: def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool: x_ran

2020-11-26 22:29:10 163

原创 leetcode #697. 数组的度

题目描述:给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。输入: [1, 2, 2, 3, 1]输出: 2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]最短连续子数组[

2020-11-26 21:29:21 73

原创 leetcode #240. 搜索二维矩阵 II

题目描述:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。思路:1、判断是不是空,如果是的话就返回False2、确定x,y的范围:x的范围是每个子list的长度,y的范围是matrix的元素个数,并且赋给初值(之所以不能都赋给0的原因是,从(0,0)开始应该怎么走,不确定是横着走还是纵着走,但是如果从(Xmax,0)开始的话,比target小就右移,比target大就上移即可。)

2020-11-23 18:03:56 70

原创 leetcode #485. 最大连续1的个数

题目描述:给定一个二进制数组, 计算其中最大连续1的个数。思路:遍历nums中的各个元素,等于1的话tmp +1,然后比较ans 与 tmp 的值,如果等于0 ,就把tmp 归零代码:class Solution: def findMaxConsecutiveOnes(self, nums: List[int]) -> int: ans,tmp = 0,0 for i in nums: if i == 1:

2020-11-21 22:56:12 114

原创 leetcode #566. 重塑矩阵

题目描述:在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。思路:1、先把nums里的元素用extend方法放入一个datalist中2、判断其长度是否等于 r*c3、将元素一个个放入

2020-11-21 22:12:31 84

原创 leetcode #剑指 Offer 67. 把字符串转换成整数

这个题的边界条件真的太难写了!!!一点脾气都没有嘤嘤嘤qwq题目描述:题目描述太长了…我搬不动思路:把符号存在flag里代码:class Solution: def strToInt(self, str: str) -> int: list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] str = str.strip() flag = 0 i = 0

2020-11-20 17:38:36 86

原创 leetcode #剑指 Offer 58 - I. 翻转单词顺序

题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。思路:1、先用strip函数把首尾的空格处理2、令i为S尾部索引,j如果不是空格就前移,直到遇到空格为止,将S[j+1:i+1]放入anslist中3、如果s[j]为空格就前移,直到不是空格为止,令i = j4、在while循环里重复上述过程代码:class Solution:

2020-11-20 11:33:26 71

原创 leetcode #696. 计数二进制子串

题目描述:给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。思路:1、记录数字连续出现的次数,比如字符串”00111011“,次数应该是【2,3,1,2】2、取相邻两个数组的最小,比如(2,3),符合题意的应该是”0011“,取min(2,3)=2,相加即可代码:class Solution: def countBinarySubstrings(self, s: str) -&

2020-11-19 23:19:00 121

原创 leetcode #9. 回文数

题目描述:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。思路:1、用str()函数把int转化为str2、用双指针,left、right,分别指向首字符和尾字符,如果相等,则向中间逼近,直到相遇为止代码:class Solution: def isPalindrome(self, x: int) -> bool: data = str(x) left = 0 right = len(data

2020-11-19 21:27:55 60

原创 leetcode #647. 回文子串

题目描述:给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。思路:用中心拓展法:1、确定一个中心,如果中心左边的字符等于右边的字符,那么left -=1,right += 1,ans+=1,循环退出的条件是索引值不超过0 和 s的长度2、还有一种情况是,以两个字母为中心,比如"abba",用第一种情况就永远也判断不到,所以应该分情况讨论代码:class Solution: def countSu

2020-11-19 21:13:38 74

原创 leetcode #409. 最长回文串

题目描述:给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。思路:1、统计各个字母出现的次数,记录在dict中。2、把次数放在一个新的数组中3、如果次数为偶数,那么直接加,次数为奇数,减一再相加(此时要有一个flag,如果都是偶数,那么最后ans不必加一,如果存在减一的情况,那么最后ans应该加一个1)代码:class Solution:

2020-11-17 19:56:19 291 2

原创 leetcode #242. 有效的字母异位词

题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。思路:有两种思路:1、分别记录 s 和 t 中字母出现的次数,记录成两个dict,然后比较这两个字典的key 和 value值2、记录s中字母出现的次数,记录成一个dict,遍历 t 中的字母,如果没有出现在dict中,返回false,否则对应的值-1,最后判断dict中是否所有的value ==0代码:思路一:class Solution: def isAnagram(self, s: str

2020-11-17 18:52:58 91 2

原创 leetcode #128. 最长连续序列

题目描述:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。思路:1、先用set去重,再用sorted()排序2、为了降低时间复杂度,对于排好序的newset中的元素i:如果i-1在newset中,那么就跳过(否则会重复计算),如果不在newset中,就加入数组split3、split中记录的是不连续的开始(因为连续的都被跳过了,不连续的才会被记录),然后求差值,返回差值最大的那个代码:newset = set(nums) ne

2020-11-16 21:56:00 114

原创 leetcode 剑指 Offer 48. 最长不含重复字符的子字符串

题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。思路:1、每次重复的片段命名为split,关键是要更新split2、split的取值是从上次重复位置的第二个开始取值3、返回anslist里长度最大的split代码:class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if len(s) < 2:#s可能为空字符串或者只包含一个字符的字符串

2020-11-16 11:33:01 122

原创 leetcode #面试题 16.02. 单词频率

题目描述:设计一个方法,找出任意指定单词在一本书中的出现频率。你的实现应该支持如下操作:WordsFrequency(book)构造函数,参数为字符串数组构成的一本书get(word)查询指定单词在书中出现的频率思路:1、构建一个dict,用来储存每个单词出现的次数2、如果要查询的单词在dict里,返回次数,否则返回0代码:超时了很多次,正确版本如下:class WordsFrequency: def __init__(self, book: List[str]):

2020-11-16 11:09:45 121

原创 leetcode #剑指 Offer 50. 第一个只出现一次的字符

题目描述:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。思路:1、创建一个dict,用来记录每个数字出现的次数2、如果是没出现过,则记录为True,否则为False(此时 not s in dict是一个布尔型变量)3、遍历s中的数字,如果是 True,就返回代码: data_dict = {} for c in s: data_dict[c] = not c in data_dict.keys()

2020-11-15 16:23:04 49

原创 leetcode #594. 最长和谐子序列

题目描述:和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。思路:1、计算每个数字出现的次数,放在data_dict中2、把key值放在新的数组1中,并排序3、维护一个数组2,如果前一个值与后一个值相差1,那么从字典中取出出现的次数,如果比数组2中最后一个数字大,那么放入数组2中,取出数组2中的最后一个值(等于说数组2中的数字一直在变大),考虑边界情况是[1,1,1,1],那么应该输出0,所以数组2中应该包

2020-11-15 15:53:00 75

原创 leetcode #1 两数之和

题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。心情复杂这题是我梦的终结吧!?嘤嘤嘤1、 暴力解 (超时了反正,我就不放了太羞耻)2、用dict,注意!!一定要注意边界条件,比如说输入【3,3】,target = 6,那么输出一定是【0,1】(即下标不同即可),所以判断条件是 i != hashmap[j]: 而不是判断nums[i]、

2020-11-14 21:56:21 118

原创 郭郭的leetcode刷题笔记(队列和堆栈·四)

DAY 4 队列和堆栈太太太累了 两天做了一道题 自闭622. 设计循环队列class MyCircularQueue: def __init__(self, k: int): """ Initialize your data structure here. Set the size of the queue to be k. """ self.queue = [None]*k self.head = None

2020-11-13 23:51:10 136

原创 郭郭的leetcode刷题笔记(队列和堆栈·二)

DAY2 队列和堆栈#20 有效的括号题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。class Solution: def isValid(self, s: str) -> bool: new_dict ={ '(':')','{':'}','[':']'} ansstack =

2020-11-12 19:47:58 129

原创 郭郭的leetcode刷题笔记(队列和堆栈·一)

DAY1 队列和堆栈232 用栈实现队列题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):错误一:只判断了self.q,应该self.q 和 self.z都判断 def empty(self) -> bool: """ Returns whether the queue is empty. """ if len(self.q) == 0:

2020-11-11 12:17:46 176

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除