LeetCode
阿清~
这个作者很懒,什么都没留下…
展开
-
LeetCode刷题——215. 数组中的第K个最大元素
题目在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。输入: [3,2,1,5,6,4] 和 k = 2输出: 5代码class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: h = [num for num in nums[:k]] heapq.heapify(h) for原创 2020-07-31 16:14:52 · 92 阅读 · 0 评论 -
347. 前 K 个高频元素
题目给定一个非空的整数数组,返回其中出现频率前 k 高的元素。输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]思路哈希表+堆哈希表保存数组中的每个值以及它的出现频率,Python中用字典实现。维护一个大小为K的最小堆。堆中每个节点保存一个键值对,按照(value,key)的方式保存,可以使得堆是按照value值排序。代码class Solution: def topKFrequent(self, nums: List[int], k: int) -原创 2020-07-31 16:12:01 · 90 阅读 · 0 评论 -
《剑指offer》刷题系列——(七十一)数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5思路暴力法是两个for循环遍历数组,比较数组中的每一对数字,但是会超时。如何减少比较次数?利用归并排序的思想。原数组: [7,5,6,4]一分为二:left = [7,5],right = [6,4]对每个子数组排序:left = [5,7],right = [4,6]归并的过程中寻找逆序对:left中的原创 2020-07-30 17:50:02 · 126 阅读 · 0 评论 -
归并排序python代码
def Merge(left, right): temp = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] <= right[j]: temp.append(left[i]) i += 1 else: temp.append(right[j]) j +=原创 2020-07-30 14:37:55 · 561 阅读 · 0 评论 -
《剑指offer》刷题系列——(七十)字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]思路求整个字符串的排列,可以看成两步:第一步是求所有可能出现在第一个位置的字符,即把第一个字符与后面所有的字符交换;第二步是固定第一个字符,求后面所有字符的排列。(第二步中求后面字符的排列依然是使用这两步的方法,也就是递归实现。)c[x]表示当前固定位。代码clas原创 2020-07-27 12:04:34 · 103 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十九)不用加减乘除做加法
题目写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。输入: a = 1, b = 1输出: 2思路使用位运算实现加法。设两数字的二进制形式 a,b ,其求和 s=a+b ,a(i)代表 a 的二进制第 i 位,则分为以下四种情况:观察发现,无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位)。因此,无进位和 nnn 与进位 ccc 的计算公式如下;代码class Solution: def add(self转载 2020-07-26 15:43:32 · 114 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十八)把数组排成最小的数
题目输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”思路定义一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。要确定排序规则,就要比较两个数字,也就是给出两个数字m和n,我们需要确定一个规则判断哪个应该排在前面。两个数字m和n可以拼接成mn和nm。如果mn<nm,那么我们应该打印mn,也就是m应该排在n前面,此原创 2020-07-26 14:25:22 · 212 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十七)把数字翻译成字符串
题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”思路动态规划思想dp[i]表示s[0...i]字符串总共可以翻译的数量初始状态:dp[0] = 1d原创 2020-07-25 15:37:42 · 83 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十六)把字符串转换成整数
题目写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一原创 2020-07-25 11:27:16 · 124 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十五)二叉搜索树的后序遍历序列
题目思路代码class Solution: def verifyPostorder(self, postorder: List[int]) -> bool: if not postorder: return True root = postorder[-1] left = 0 while left<len(postorder)-1: if postorder[left]>原创 2020-07-25 10:03:22 · 110 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十四)二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。思路要求转换之后的链表是排好序的,而根据二叉搜索树的特点,使用中序遍历,可以按照从小到大的顺序访问二叉树的每个节点。在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个几点也有两个指针,分别指向前一个节点和后一个节点。两者之间有相似之处,如果能将二叉搜索树中原本指向左子节点的指针调整为链表中指向前一个节点的指针,原本指向右子节点的指针调整为链表中指向后一个节点的指针,原创 2020-07-23 21:37:12 · 74 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十三)扑克牌中的顺子
题目从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True思路大小王可以看成任意数字,我们就先把它们都看成0。判断五个数字是不是连续的,最直观的办法是把数组排序。由于0可以实任意数字,因此我们可以用0去补满数组中的空缺。如果排序之后的数组不是连续的,原创 2020-07-22 15:38:58 · 121 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十二)n个骰子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。输入: 2输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]思路动态规划求解。当有n个骰子时,点数和的最小值为n,最大值为n * 6。创建一个n行6原创 2020-07-22 14:42:28 · 202 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十一)丑数
题目我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。思路定义一个数组用来保存n个丑数,然后逐个填满数组。初始化:默认1为丑数,所以数组的第一个元素为1。开始填下一个数字:每个丑数都是由其前面的丑数乘以2、乘以3或者乘以5得到的,但是整个数组需要时排序的,所以每次添加一个新值都要保证它是当前可以加进原创 2020-07-21 12:49:48 · 65 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十)最长不含重复字符的子字符串
题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 :输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路动态规划的思想动态转移方程:dp[j]表示以第j个字符结尾的最长不含重复字符的子字符串i 表示距离第j个字符最近的相同字符的索引如果j-i > dp[j-1],说明s[i]在当前计算的最长子字符串范围之外,dp[j] = dp[j-1]+1 如果j-i <= dp[j-1],说原创 2020-07-21 11:53:41 · 107 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十九)数据流中的中位数
题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例 :输入:[“原创 2020-07-21 10:45:37 · 107 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十八)最小的k个数
题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 :输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]思路一、利用快速排序的思想。快速排序的partition函数每次返回一个索引值index,一次排序之后,index左边的数都小于index位置上的数。因此当我们返回index值时,就将它与k-1值比较,如果刚好等于k-1,则直接输出arr数组的前k个元素(索引为0到k-原创 2020-07-20 16:16:49 · 135 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十七)机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 :输入:m = 2, n = 3, k = 1输出:3思路本题与 矩阵中的路径 题原创 2020-07-20 11:04:42 · 96 阅读 · 0 评论 -
快速排序python代码
def quick_sort(nums, left, right): if left < right: index = partition(nums, left, right) quick_sort(nums, left, index-1) quick_sort(nums, index+1, right) return numsdef partition(nums, left, right): key = nums[left原创 2020-07-19 15:28:12 · 215 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十六)圆圈中最后剩下的数字
题目0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。代码class Solution: def lastRemaining(self, n: int, m: int) -> int: if n<1 or m<1: return None原创 2020-07-19 14:18:36 · 63 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十五)求1+2+…+n
题目求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。输入: n = 3输出: 6思路以逻辑运算符 && 为例,对于 A && B 这个表达式,如果 A 表达式返回 False ,那么 A && B 已经确定为 False ,此时不会去执行表达式 B。同理,对于逻辑运算符 ||, 对于 A || B 这个表达式,如果 A 表达式返回 True ,那么 A || B原创 2020-07-19 13:44:57 · 114 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十四)数组中数字出现的次数 II
题目在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路这个题没有要求时间复杂度和空间复杂度,所以可以用哈希表。python用字典结构实现。如果该数字已经存在于字典中,就把value值加1,如果不存在,就以该数字为key存入字典。最后返回value为1的key值。代码class Solution: def singleNumber(self, nums: List[int]) -> int: dic={}原创 2020-07-18 14:24:34 · 82 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十三)数组中数字出现的次数 I
题目一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 :输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]思路我们先考虑,如果题目要求是数组中只有一个数字出现了一次,那么怎么找出这个数字呢?异或运算的性质是,任何一个数字异或它自己都等于0。如果我们从头到尾依次异或数组中的每个数字,那么最终的结果刚好是那个只出现了一次的数字,因为其他成对出现两次的数字全部在异或过程中抵消原创 2020-07-18 13:30:42 · 90 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十二)滑动窗口的最大值
题目给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]思路queue是一个双端队列,队列的头部始终每一步的保存最大值;res保存所有滑动窗口的最大值。开始遍历nums数组,一共包含两个过程:当窗口里的数字小于等于k个时,存入一个数字,在存入一个数字之前,首先判断队列尾部的数字是否小于待存入的数字,如果已有的数字小于待存入的数字,那么这些数字已经不可能原创 2020-07-18 10:36:59 · 143 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十一)和为s的两个数字
题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 :输入:target = 9输出:[[2,3,4],[4,5]]思路可以参考 和为s的两个数字,用双指针解决。用small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列之和小于s,则增加big,让序列包含更多的数字;如果从small到big的序列之和大于s,则从原创 2020-07-16 14:04:32 · 95 阅读 · 0 评论 -
《剑指offer》刷题系列——(五十)和为s的两个数字
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 :输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]思路两个指针start,end记录数组的头和尾的索引。如果nums[start]+nums[end]==target,则找到了符合要求的两个数字;如果nums[start]+nums[end]<target,由于数组是排序的,则原创 2020-07-16 13:09:38 · 124 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十九)构建乘积数组
题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]思路定义c[i]=a[0]*a[1]*...*a[i-1]定义d[i]=a[i+1]*...*a[n-2]*a[n-1]则b[i]等于c[i]与d[i]的乘积c[i]=c[i-1]*a[i-1]d[i]=d[i原创 2020-07-16 09:48:09 · 86 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十八)数值的整数次方
题目实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.10000, 3输出: 9.26100示例 2:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25思路二分法的思想求x的n次方:特殊情况考虑:当指数为负数时,先对指数求绝对值,计算出次方的结果之后再取倒数;当指数为1时,求次方的结果还是x原创 2020-07-15 13:34:49 · 103 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十七)栈的压入、弹出
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。思路利用一个辅助栈。node 保存popped序列中当前要比较的值的索引,初始为0.依次将pushed序列里的元素入栈,每次入栈之后,都要比较栈顶元素与popped[node]是否相等,如果相等就弹出,nod原创 2020-07-15 10:24:29 · 233 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十六) 第一个只出现一次的字符
题目在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "思路利用哈希表统计各字符出现的数量,返回第一个出现一次的字符。python中可以用字典实现哈希表的结构。字典中的键是唯一的,每个键的键值保存该键是否出现一次,如果是设置为true,如果不是设置为false。然后遍历字典,找到第一个值为false的键返回。如果没有返回 ’ '。代码class Solution:原创 2020-07-14 22:57:50 · 144 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十五)股票的最大利润
题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例1 :输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。思路求第 i 天的最大利润dp[ i原创 2020-07-14 14:44:49 · 226 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十四)剪绳子 II
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路在 剪绳子 I 的基础上增加取模操作即可。代码class Sol原创 2020-07-14 13:20:48 · 236 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十三)剪绳子 I
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 :输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1思路定义函数f(n)为把长度为n的绳子剪成若干段后各段长度乘积的最大值。初始化:n=1时,f(1原创 2020-07-14 11:30:41 · 100 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十二)礼物的最大价值
题目在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 :输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物思路动态规划问题首先申请一个与题目数组相同大小的二维空数组res。res中每个元素res[ i ] [ j原创 2020-07-13 17:24:05 · 125 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十一)矩阵中的路径
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第原创 2020-07-13 14:45:57 · 161 阅读 · 0 评论 -
《剑指offer》刷题系列——(四十)二进制中1的个数
题目请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 :输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。思路始终在n的末尾判断是否为1,每判断一位,就右移一位舍去,直到n为0。代码class Solution: def hamm原创 2020-07-13 10:47:42 · 174 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十九)合并两个排序的链表
题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路从两个链表的第一个节点开始比较,当两个链表都不为空时,如果l1.val<=l2.val将 l1节点加入到node链表中,并将 l1和node向右移动;如果l1.val>l2.val将 l2节点加入到node链表中,并将 l2和node向右移动;循环结束后,如果原创 2020-07-12 16:03:26 · 127 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十八)左旋转字符串
题目字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 :输入: s = “abcdefg”, k = 2输出: “cdefgab”代码方法一:切片class Solution: def reverseLeftWords(self, s: str, n: int) -> str: return s[n:]+s[原创 2020-07-12 13:29:32 · 107 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十七)翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括思路双指针法,两个指针而分别用来定位每个单词的首尾位置。因为需要翻转,所以从字符串的右边开始往左遍历。初始时,指针 i 和指针 j原创 2020-07-12 12:22:47 · 103 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十六)序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树。示例:思路序列化二叉树就是将二叉树按照层序遍历输出各个节点值;反序列化二叉树是根据序列化结果(即层序遍历的结果)重新构建二叉树。有关层序遍历二叉树,一般使用队列。反序列化二叉树:也使用队列,初始时,将data列表中的第一个值删除,并作为树的根节点插入队列。当队列不为空时进入循环:队列中每次popleft()一个节点node,就要将data[ ]的中的开头两个值删除,并作为node的左右节点的值。由于data中保存了某些null节点,原创 2020-07-11 15:08:51 · 105 阅读 · 0 评论