【leetcode刷题之路】面试经典150题(1)——数组/字符串

文章目录

      • 1 数组/字符串
        • 1.1 【排序】合并两个有序数组
        • 1.2【双指针】移除元素
        • 1.3 【双指针】删除有序数组中的重复项
        • 1.4 【双指针】删除有序数组中的重复项 II
        • 1.5 【数学】多数元素
        • 1.6 【数组】轮转数组
        • 1.7 【动态规划】买卖股票的最佳时机
        • 1.8 【贪心】买卖股票的最佳时机 II
        • 1.9 【贪心】【动态规划】跳跃游戏
        • 1.10 【贪心】【动态规划】跳跃游戏 II
        • 1.11 【二分】H 指数
        • 1.12 【模拟】时间插入、删除和获取随机元素
        • 1.13 【前缀和】除自身以外数组的乘积
        • 1.14 【贪心】加油站
        • 1.15 【贪心】分发糖果
        • 1.16 【双指针】接雨水
        • 1.17 【哈希表】罗马数字转整数
        • 1.18 【哈希表】整数转罗马数字
        • 1.19 【字符串】最后一个单词的长度
        • 1.20 【字符串】最长公共前缀
        • 1.21 【字符串】反转字符串中的单词
        • 1.22 【字符串】Z字形变换
        • 1.23 【字符串】找出字符串中第一个匹配项的下标
        • 1.24 【模拟】文本左右对齐

1 数组/字符串

1.1 【排序】合并两个有序数组

题目地址:https://leetcode.cn/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150

  直接将 n u m 2 num2 num2拼到 n u m 1 num1 num1后面排序即可。

class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:for i in range(n):nums1[m+i] = nums2[i]nums1.sort()
1.2【双指针】移除元素

题目地址:https://leetcode.cn/problems/remove-element/description/?envType=study-plan-v2&envId=top-interview-150

  将符合条件的 v a l val val值全部移到数组的末尾,同时记录数组长度。

class Solution:def removeElement(self, nums: List[int], val: int) -> int:if len(nums) == 0:return 0left = 0right = len(nums) - 1while left < right:while((left<right) and (nums[left]!=val)):left += 1while((left<right) and (nums[right]==val)):right -= 1nums[left], nums[right] = nums[right], nums[left]if(nums[left]==val):return leftelse:return left+1
1.3 【双指针】删除有序数组中的重复项

题目地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150

   l e f t left left记录当前遍历时未重复的元素,如果碰见重复的元素,则通过 r i g h t right right进行交换赋值。

class Solution:def removeDuplicates(self, nums: List[int]) -> int:  left = 0right = 1while(right < len(nums)):if nums[left]!=nums[right]:left += 1nums[left] = nums[right]right += 1return left+1
1.4 【双指针】删除有序数组中的重复项 II

题目地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envType=study-plan-v2&envId=top-interview-150

  按照上一题的思路,如果遇到重复的元素,比较其之后间隔两个 i n d e x index index的元素即可。

class Solution:def removeDuplicates(self, nums: List[int]) -> int:left = 0for right in range(len(nums)):if(left<2 or nums[right]!=nums[left-2]):nums[left] = nums[right]left += 1return left
1.5 【数学】多数元素

题目地址:https://leetcode.cn/problems/majority-element/description/?envType=study-plan-v2&envId=top-interview-150

  先对数组进行排序,因为多数元素是次数超过数组长度一半的元素,所以排序后数组的中间位置一定是多数元素。

class Solution:def majorityElement(self, nums: List[int]) -> int:nums.sort()return nums[len(nums)//2]
1.6 【数组】轮转数组

题目地址:https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&envId=top-interview-150

  先对前 n − k n-k nk个元素进行翻转,在对后 k k k个元素进行翻转,最后对整个数组进行翻转。

class Solution:def rotate(self, nums: List[int], k: int) -> None:n = len(nums)k = k % ndef swap(l,r):while(l<r):nums[l], nums[r] = nums[r], nums[l]l = l+1r = r-1swap(0,n-k-1)swap(n-k,n-1)swap(0,n-1)
1.7 【动态规划】买卖股票的最佳时机

题目地址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/?envType=study-plan-v2&envId=top-interview-150

d p _ 0 dp\_0 dp_0:表示第 i i i天结束的时候,如果手里没有持有股票,最大的利润是多少。

d p _ 1 dp\_1 dp_1:表示第 i i i天结束的时候,如果手里持有股票,最大的利润是多少。

在这里我们分别对上述两个进行计算:

  • d p _ 0 dp\_0 dp_0:这个考虑到两种情况,一是第 i − 1 i-1 i1天没有持有股票,所以与第 i − 1 i-1 i1天未持有股票的利润一样,二是第 i − 1 i-1 i1天持有股票,但是决定在第 i i i天卖掉,所以利润为第 i − 1 i-1 i1天持有股票的利润+第 i i i天该股票的价格,两个取最大值即可。
  • d p _ 1 dp\_1 dp_1:这个也考虑到两种情况,一是第 i − 1 i-1 i1天持有股票,所以与第 i − 1 i-1 i1天持有股票的利润一样,二是第 i − 1 i-1 i1天未持有股票,但是决定在第 i i i天买入,所以利润为负值,两个取最大值即可。
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices)==1:return 0dp_0 = 0dp_1 = -prices[0]i = 0while(i < len(prices)):dp_0 = max(dp_0, dp_1 + prices[i])dp_1 = max(dp_1, -prices[i])i += 1return dp_0
1.8 【贪心】买卖股票的最佳时机 II

题目地址:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envType=study-plan-v2&envId=top-interview-150

  由局部最优解推到全局最优解,最大利润拆分到每天就是每两天之间进行股票交易,积累其为正数的利润,即为最大利润。

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices)==1:return 0ssum = 0i = 1while(i<len(prices)):if prices[i]-prices[i-1] > 0:ssum += prices[i]-prices[i-1]i += 1return ssum
1.9 【贪心】【动态规划】跳跃游戏

题目地址:https://leetcode.cn/problems/jump-game/description/?envType=study-plan-v2&envId=top-interview-150

  能走到最后一个位置,那么它前面的位置也能走到,所以只需要判断最远可以走到哪里,然后与数组的长度进行比较即可。

class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums)==1:return Trueif nums[0]==0:return Falsemax_step = 0for i in range(len(nums)):if max_step>=i and i+nums[i]>max_step:max_step = i+nums[i]return max_step>=len(nums)-1
1.10 【贪心】【动态规划】跳跃游戏 II

题目地址:https://leetcode.cn/problems/jump-game-ii/description/?envType=study-plan-v2&envId=top-interview-150

  在上一题的基础上,记录步数即可,每次选择下一步时,要选择尽可能走到更远的下一步。

class Solution:def jump(self, nums: List[int]) -> int:max_pos, end, step = 0, 0, 0for i in range(len(nums)-1):if max_pos >= i:max_pos = max(max_pos, i + nums[i])if i == end:end = max_posstep += 1return step
1.11 【二分】H 指数

题目地址:https://leetcode.cn/problems/h-index/description/?envType=study-plan-v2&envId=top-interview-150

  从 0 0 0 n n n挨个遍历 h h h指数,找到最高的那个 h h h指数即可。

class Solution:def hIndex(self, citations: List[int]) -> int:left, right = 0, len(citations)while(left<right):mid = (left+right+1)//2cnt = 0for cit in citations:if cit>=mid:cnt += 1if cnt>=mid:left = midelse:right = mid-1return left
1.12 【模拟】时间插入、删除和获取随机元素

题目地址:https://leetcode.cn/problems/insert-delete-getrandom-o1/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class RandomizedSet:def __init__(self):self.num = []def insert(self, val: int) -> bool:if val in self.num:return Falseelse:self.num.append(val)return Truedef remove(self, val: int) -> bool:if val not in self.num:return Falseelse:self.num.remove(val)return Truedef getRandom(self) -> int:i = random.randint(0, len(self.num)-1)return self.num[i]# Your RandomizedSet object will be instantiated and called as such:
# obj = RandomizedSet()
# param_1 = obj.insert(val)
# param_2 = obj.remove(val)
# param_3 = obj.getRandom()
1.13 【前缀和】除自身以外数组的乘积

题目地址:https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150

  分别计算索引左边的数字乘积和索引右边的数字乘积,两者乘积结果即为该索引的乘积结果。

class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:length = len(nums)left_ans, right_ans, answer = [0]*length, [0]*length, [0]*lengthleft_ans[0] = 1for i in range(1,length):left_ans[i] = left_ans[i-1]*nums[i-1]right_ans[length-1] = 1for i in range(length-2,-1,-1):right_ans[i] = right_ans[i+1]*nums[i+1]for i in range(length):answer[i] = left_ans[i]*right_ans[i]return answer
1.14 【贪心】加油站

题目地址:https://leetcode.cn/problems/gas-station/description/?envType=study-plan-v2&envId=top-interview-150

考虑两种情况:

  • 情况一:如果总的油量剩余小于 0 0 0,则从哪个加油站出发都不能走完一圈。
  • 情况二:从加油站 n n n到加油站 m m m之间的油量剩余之和不能小于 0 0 0,否则不能走完一圈,局部最优推到全局最优。
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:start, cur_res, total_res = 0, 0, 0for i in range(len(gas)):cur_res += gas[i] - cost[i]total_res += gas[i] - cost[i]if cur_res < 0:cur_res = 0start = i + 1if total_res < 0:return -1else:return start
1.15 【贪心】分发糖果

题目地址:https://leetcode.cn/problems/candy/description/?envType=study-plan-v2&envId=top-interview-150

考虑两种情况:

  • 情况一:从左往右数,首先每个学生发一颗糖果,如果学生 A A A r a t i n g rating rating大于学生 B B B,则学生 A A A的糖果数要比学生 B B B多一颗,数量记在 l e f t left left中。
  • 情况二:从右往左数,首先每个学生发一颗糖果,如果学生 B B B r a t i n g rating rating大于学生 A A A,则学生 B B B的糖果数要比学生 A A A多一颗,数量记在 r i g h t right right中。

最后结果为left和right中对应最大值之和。

class Solution:def candy(self, ratings: List[int]) -> int:length = len(ratings)left, right, cnt = [1]*length, [1]*length, 0for i in range(1,length):if ratings[i] > ratings[i-1]:left[i] = left[i-1] + 1for i in range(length-2,-1,-1):if ratings[i] > ratings[i+1]:right[i] = right[i+1] + 1cnt += max(left[i],right[i])cnt += max(left[length-1],right[length-1])return cnt 
1.16 【双指针】接雨水

题目地址:https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-interview-150

  双指针解决,分别记录左边和右边的最大值,然后依次从两边往中间记录差值,最后差值的和即为接雨水量

class Solution:def trap(self, height: List[int]) -> int:length = len(height)if length == 0:return 0ans = 0left, right = 0, length-1max_left, max_right = height[0], height[length-1]while left < right:max_left = max(max_left,height[left])max_right = max(max_right,height[right])if max_left < max_right:ans += max_left-height[left]left += 1else:ans += max_right-height[right]right -= 1return ans
1.17 【哈希表】罗马数字转整数

题目地址:https://leetcode.cn/problems/roman-to-integer/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def romanToInt(self, s: str) -> int:Roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}ans = 0for i in range(len(s)-1):if Roman[s[i]] < Roman[s[i+1]]:ans -= Roman[s[i]]else:ans += Roman[s[i]]ans += Roman[s[-1]]return ans
1.18 【哈希表】整数转罗马数字

题目地址:https://leetcode.cn/problems/integer-to-roman/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def intToRoman(self, num: int) -> str:hashmap = {1000:'M', 900:'CM', 500:'D', 400:'CD', 100:'C', 90:'XC', 50:'L', 40:'XL', 10:'X', 9:'IX', 5:'V', 4:'IV', 1:'I'}ans = ''for key in hashmap:if num // key != 0:cnt = num // keyans += hashmap[key]*cntnum %= keyreturn ans
1.19 【字符串】最后一个单词的长度

题目地址:https://leetcode.cn/problems/length-of-last-word/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def lengthOfLastWord(self, s: str) -> int:string_list = s.split(" ")ans = ""for i in range(len(string_list)-1,-1,-1):if string_list[i] == "":continueelse:ans = string_list[i]breakreturn len(ans)
1.20 【字符串】最长公共前缀

题目地址:https://leetcode.cn/problems/longest-common-prefix/description/?envType=study-plan-v2&envId=top-interview-150

  纵向比较找出最长公共前缀。

class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:length = len(min(strs))ans = ""for i in range(0,length):for j in range(0,len(strs)-1):if strs[j][i] != strs[j+1][i]:return ansans += strs[0][i]return ans
1.21 【字符串】反转字符串中的单词

题目地址:https://leetcode.cn/problems/reverse-words-in-a-string/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def reverseWords(self, s: str) -> str:string_list = s.split(" ")ans = ""for i in range(len(string_list)-1,-1,-1):if string_list[i] != "":ans += string_list[i] + " "if ans[-1] == " ":ans = ans[:-1]return ans
1.22 【字符串】Z字形变换

题目地址:https://leetcode.cn/problems/zigzag-conversion/description/?envType=study-plan-v2&envId=top-interview-150

  对字符串根据 n u m R o w s numRows numRows进行分组, f l a g flag flag代表字符串 Z Z Z字形方向。

class Solution:def convert(self, s: str, numRows: int) -> str:if numRows==1:return sans = [""]*numRowsi, flag = 0, -1for c in s:ans[i] += cif i == 0 or i == numRows-1:flag = -flagi += flagreturn "".join(ans)
1.23 【字符串】找出字符串中第一个匹配项的下标

题目地址:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def strStr(self, haystack: str, needle: str) -> int:if needle not in haystack:return -1else:return haystack.index(needle)
1.24 【模拟】文本左右对齐

题目地址:https://leetcode.cn/problems/text-justification/description/?envType=study-plan-v2&envId=top-interview-150

  详见代码。

class Solution:def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:res, line, str_num = [], [], 0for word in words:# line中所有单词加一起的长度 + line中单词(单词与单词之间原生需要1个空格)之间的间距数 + 当前需要判断的单词长度# 上述之和大于等于maxWidth时会溢出,为什么等于时也会溢出?因为若新加入Word,会新增加1个间距(即空格长度)if str_num + len(line)-1 + len(word) >= maxWidth:for i in range(maxWidth - str_num):# 循环将每个空格依次加到每个单词之间的间距上line[i%max(len(line)-1, 1)] += ' 'res.append(''.join(line))line, str_num = [], 0line.append(word)str_num += len(word)return res + [' '.join(line).ljust(maxWidth)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Windows】MacOS制作纯净版Windows10安装U盘

方法一、在window系统中更新win10&#xff08;不更新引导程序&#xff09; cp -rp /Volumes/Windows10专业版\ 64位/* /Volumes/WIN10/https://baijiahao.baidu.com/s?id1760695844372493842&wfrspider&forpc 方法二、在window系统中更新win10&#xff08;更新引导程…

《Docker极简教程》--Docker容器--Docker容器的创建和使用

一、创建Docker容器 1.1 使用现有镜像创建容器 当使用现有镜像创建容器时&#xff0c;通常会涉及以下步骤&#xff1a; 获取镜像&#xff1a;首先&#xff0c;需要从Docker Hub或其他镜像仓库获取所需的镜像。可以使用docker pull命令来获取镜像&#xff0c;语法如下&#x…

45. 跳跃游戏 II(难度:中等)

题目链接&#xff1a;https://leetcode.cn/problems/jump-game-ii/ 题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳…

软件实例分享,洗车店系统管理软件会员卡电子系统教程

软件实例分享&#xff0c;洗车店系统管理软件会员卡电子系统教程 一、前言 以下软件教程以 佳易王洗车店会员管理软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、会员卡号可以绑定车牌号或手机号 2、卡号也可以直接使用手机号&a…

【Java万花筒】优雅配置,从容应对:Java配置管理库深度解读

灵活应对变化&#xff1a;Java配置管理库全景解析 前言 在构建现代化的Java应用时&#xff0c;配置管理是一个至关重要的方面。精心设计的配置管理能够为应用提供灵活性、可维护性和适应性&#xff0c;而Java社区提供了多种优秀的配置管理库。本文将深入探讨一些主流的Java配…

优秀的电机驱动MCU:MM32SPIN360C

DC-DC电源布局注意点&#xff1a; 电源模块布局布线可提前下载芯片的datasheet&#xff08;数据表&#xff09;&#xff0c;按照推荐的布局和布线进行设计。 1) 芯片电源接近原则&#xff1a; 对于为芯片提供电压的开关电源&#xff0c;应确保它尽量靠近芯片放置。这样可以避…

2024 CKS 题库 | 8、沙箱运行容器 gVisor

不等更新题库 CKS 题库 8、沙箱运行容器 gVisor Context 该 cluster 使用 containerd 作为 CRI 运行时。containerd 的默认运行时处理程序是 runc 。 containerd 已准备好支持额外的运行时处理程序 runsc (gVisor)。 Task 使用名为 runsc 的现有运行时处理程序&#xff0c;…

【打工日常】使用docker部署可视化工具docker-ui

一、docker-ui介绍 docker-ui是一个易用且轻量化的Docker管理工具&#xff0c;透过Web界面的操作&#xff0c;方便快捷操作docker容器化工作。 docker-ui拥有易操作化化界面&#xff0c;不须记忆docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于docker的特性&…

幻兽帕鲁新手游戏攻略分享

在幻兽帕鲁中&#xff0c;提高实力是玩家不断追求的目标。以下是一些提高实力的攻略&#xff1a; 1、升级和进化&#xff1a;通过战斗和完成任务&#xff0c;玩家可以获得经验值&#xff0c;提升自己的等级。随着等级的提升&#xff0c;玩家可以获得技能点&#xff0c;用于提升…

AGAST角点检测

一、AGAST角点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/visualization/pcl_visualizer.h> #include <boost/thread/thread.hpp> #include <p…

支付交易——跨境交易

摘要 老王兢兢业业经营生意多年&#xff0c;一步步从小杂货店做到现在&#xff0c;成立大型贸易公司。在做大做强的过程中&#xff0c;老王觉得国内市场已经饱和&#xff0c;竞争处处是红海。老王留意海外很多年了&#xff0c;决定走出去&#xff0c;转向海外:将国外的商品引进…

【51单片机】AD模数转换DA数模转换(江科大)

1.AD/DA介绍 AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号 DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号 AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理…

RestTemplate自定义设置

增加类&#xff1a;RestTemplateConfig import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.Htt…

GB28181 2022 下联检测项

序号 检测项目 技术要求 1平台注册 (下联) 视频监控联网测试软件注册到受测平 台,并在注册到期前进行刷新注册; 宜支持注册重定向功能。 2平台注销 (下联) 视频监控联网测试软件从受测平台注 销 3平台校时 (下联) 视频监控联网测试软件获取受测平台 的时间。 4平…

Java面向对象案例之打印机对象Printer(一)

类主要结构图 抽象类&#xff1a;Printer&#xff08;打印机作为父类&#xff09;子类&#xff1a;DotMatrixPrinter&#xff08;针式打印机类&#xff09;、InkpetPrinter&#xff08;喷墨打印机类&#xff09;、LaserPrinter&#xff08;激光打印机类&#xff09;测试类&…

# Day44、动态规划(包含题目 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ )

代码随想录算法训练营第7周&#xff08;C语言&#xff09;|Day41&#xff08;动态规划&#xff09; Day44、动态规划&#xff08;包含题目 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ &#xff09; 518. 零钱兑换 II 题目描述 给定不同面额的硬币和一个总金额。写出函数来计…

【嵌入式硬件】ADC(模数转换器)

目录 1.简介 2.分类 2.1 并行比较模数转换器 2.2 逐次逼近型模数转换器

【网络安全/计算机/编程】实用小工具推荐,让你的电脑更强大

在日常的电脑使用中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;比如找不到想要的音乐、不知道如何合并图片、蓝屏问题困扰等。 今天&#xff0c;我将向大家推荐几款实用的小工具&#xff0c;它们可以帮助我们更方便地解决这些问题。 首先&#xff0c;是PC洛雪音乐…

数据转换成json格式

// List<SpinfokuZD> xm GetmoreSpinfoku(id); // return JsonConvert.SerializeObject(xm); //将数据转换成json格式 return JsonConvert.SerializeObject(ds); //将数据转换成json格式 spcgjlZD spselld JsonConvert.Deseriali…

基于SSM的社区疫情防控管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的社区疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…