Leetcode刷题笔记——数组与字符串篇

Leetcode刷题笔记——数组与字符串篇

一、数组

第一题

Leetcode14:最长公共前缀:简单题 (详情点击链接见原题)

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""

  • 当前字符串数组长度为0时则公共前缀为空,直接返回
  • 令最长公共前缀ans的值为第一个字符串进行初始化
  • 遍历后面的字符串,依次将其与ans进行比较,两两找出公共前缀,最终结果即为最长公共前缀
  • 如果查找过程中出现了ans为空的情况,则公共前缀不存在直接返回

python代码解法:

class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:res = strs[0]   # 初始化strs中的第一个字符串为最长公共前缀for i in range(1, len(strs)):ans = ''temp = strs[i]for j in range(0, min(len(temp), len(res))):if temp[j] == res[j]:ans += temp[j]else:breakres = ansif not ans:		# 如果查找过程中出现了ans为空的情况,则公共前缀不存在直接返回breakreturn res

第二题

Leetcode977. 有序数组的平方:简单题 (详情点击链接见原题)

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序

解题思路:借助额外的空间,数组其实是有序的,只不过负数平方之后可能成为最大数了,那么数组平方的最大值就在数组两端,不是左边就是右边,不可能是中间
python代码解法:

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:result = [0] * len(nums)left, right = 0, len(nums) - 1i = rightwhile i >= 0:if nums[left] ** 2 < nums[right] ** 2:result[i] = nums[right] ** 2right -= 1elif nums[left] ** 2 >= nums[right] ** 2:result[i] = nums[left] ** 2left += 1i -= 1return result

第三题

Leetcode48:旋转图像/面试题:旋转矩阵:中等题 (详情点击链接见原题)

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像

class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""n = len(matrix)# 一圈一圈的转,一共需要转 n // 2 圈# 注意循环不变量原则: 我是按照左闭右开的形式进行旋转,所以是 n - 1 - ifor i in range(n // 2):for j in range(i, n - i - 1):temp = matrix[i][j]  # 保存左上matrix[i][j] = matrix[n - 1 - j][i]  # 1.左下赋给左上matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]  # 2.右下赋给左下matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]   # 3.右上赋给右下matrix[j][n - 1 - i] = temp    # 4.保存起来的左上赋给右上

第四题

Leetcode59. 螺旋矩阵 II:中等题 (详情点击链接见原题)

给你一个正整数 n ,生成一个包含 1 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

python代码解法:

"""
# n = 5
1     2     3     4     5
16    17    18    19    6
15    24    25    20    7
14    23    22    21    8
13    12    11    10    9# n = 6
1     2     3     4     5     6
20    21    22    23    24    7
19    32    33    34    25    8
18    31    36    35    26    9
17    30    29    28    27    10
16    15    14    13    12    11
"""
class Solution:def generateMatrix(self, n: int) -> List[List[int]]:matrix = [[0] * n for _ in range(n)]loop = n // 2      # 确定迭代次数mid = n // 2       # 当 n 为奇数的时候用于填充最后一个位置的空缺start_x, start_y = 0, 0     # 在每轮迭代填充数据时的定位count = 1# offset = 1 填充最外圈# offset = 2 填充次外圈# offset = 3# offset = ...for offset in range(1, loop + 1):   # offset用来表示每次循环的圈数控制,每轮填充时预留最后一个位置用于下轮填充的起始位置for c in range(start_y, n - offset):       # 固定首行,变换列matrix[start_x][c] = countcount += 1for r in range(start_x, n - offset):       # 固定尾列,变换行matrix[r][n - offset] = countcount += 1for c in range(n - offset, start_y, -1):        # 固定尾行,变换列matrix[n - offset][c] = countcount += 1for r in range(n - offset, start_x, -1):        # 固定首列,变换行matrix[r][start_y] = countcount += 1start_x += 1start_y += 1if n % 2 != 0:matrix[mid][mid] = countreturn matrix

第四题进阶

Leetcode54:螺旋矩阵:中等题 (详情点击链接见原题)

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素

python代码解法:

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:up, down, left, right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1result = []while True:for l_to_r in range(left, right + 1):  # 从左到右result.append(matrix[up][l_to_r])up += 1if up > down:breakfor u_to_d in range(up, down + 1):      # 从上到下result.append(matrix[u_to_d][right])right -= 1if right < left:breakfor r_to_l in range(right, left - 1, -1):  # 从右到左result.append(matrix[down][r_to_l])down -= 1if down < up:breakfor d_to_u in range(down, up - 1, -1):       # 从下到上result.append(matrix[d_to_u][left])left += 1if left > right:breakreturn result

第五题

Leetcode189.轮转数组:中等题 (详情点击链接见原题)

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数

nums = [1,2,3,4,5,6,7], k = 3
1 2 3 | 4 5 6 7
step1:先整体倒叙 7 6 5 | 4 3 2 1
step2:将字符串分为两个部分,再对两部分进行局部倒叙 5 6 7 | 1 2 3 4

python代码解法:

class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""if k > len(nums):k %= len(nums)def reverse(num, start, end):i, j = start, endwhile i < j:num[i], num[j] = num[j], num[i]i += 1j -= 1reverse(nums, 0, len(nums) - 1)reverse(nums, 0, k - 1)reverse(nums, k, len(nums) - 1)

第六题

Leetcode238. 除自身以外数组的乘积:中等题 (详情点击链接见原题)

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

  1. 初始化:数组res,其中res[0] = 1,辅助变量temp = 1
  2. 计算res[i]的下三角各元素的乘积,直接乘入res[i]
  3. 计算 res[i]的上三角各元素的乘积,记为 temp,并乘入res[i]

python代码解法:

from typing import Listclass Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:res = [1] * len(nums)temp = 1for i in range(1, len(nums)):res[i] = res[i - 1] * nums[i - 1]for i in range(len(nums) - 2, -1, -1):temp *= nums[i + 1]res[i] = res[i] * tempreturn res

第七题

Leetcode289. 生命游戏:中等题 (详情点击链接见原题)

生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机

python代码解法:

import copyclass Solution:def gameOfLife(self, board: List[List[int]]) -> None:"""Do not return anything, modify board in-place instead.""" # 构造 board 的深拷贝matrix = copy.deepcopy(board)    # 面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子for r in range(len(board)):for c in range(len(board[0])):if matrix[r][c] == 1:count = 0for x, y in [(r, c - 1), (r, c + 1), (r - 1, c), (r + 1, c), (r - 1, c - 1), (r - 1, c + 1),(r + 1, c - 1), (r + 1, c + 1)]:if 0 <= x < len(board) and 0 <= y < len(board[0]):if matrix[x][y] == 1:count += 1if count < 2 or count > 3:board[r][c] = 0   # 活细胞死亡else:count = 0for x, y in [(r, c - 1), (r, c + 1), (r - 1, c), (r + 1, c), (r - 1, c - 1), (r - 1, c + 1),(r + 1, c - 1), (r + 1, c + 1)]:if 0 <= x < len(board) and 0 <= y < len(board[0]):if matrix[x][y] == 1:count += 1if count == 3:board[r][c] = 1   # 死细胞复活

第八题

Leetcode27. 移除元素:中等题 (详情点击链接见原题)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度

python代码解法:

class Solution:def removeElement(self, nums: List[int], val: int) -> int:slow_index, fast_index = 0, 0while fast_index < len(nums):if nums[fast_index] != val:nums[slow_index] = nums[fast_index]slow_index += 1fast_index += 1return slow_index

二、字符串

第一题

Leetcode443:压缩字符串:中等题 (详情点击链接见原题)

给你一个字符数组 chars ,请使用下述算法压缩:
从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :
如果这一组长度为 1 ,则将字符追加到 s 中。
否则,需要向 s 追加字符,后跟这一组的长度

第二题

Leetcode151. 反转字符串中的单词:中等题 (详情点击链接见原题)

给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串

解题思路如下:
" the sky is blue "

  • 移除多余空格 the sky is blue
  • 将整个字符串反转 eulb si yks eht
  • 将每个单词反转 blue is the sky the

python代码解法:

class Solution:def reverseWords(self, s: str) -> str:def remove_extra_space(strs):  # 1.去除首尾以及中间多余的空格start, end = 0, len(strs) - 1while s[start] == ' ':start += 1while s[end] == ' ':end -= 1array = []while start <= end:temp = s[start]if temp != ' ' or array[-1] != ' ':array.append(temp)start += 1return "".join(array)st = remove_extra_space(s)st = st[::-1]  # 2.反转整个字符串def reverse_str(str1):str1 = list(str1)i, j = 0, len(str1) - 1while i < j:str1[i], str1[j] = str1[j], str1[i]i += 1j -= 1return "".join(str1)i = 0start = 0strs = ""while i < len(st):if st[i] == ' ':strs += reverse_str(st[start:i])  # 反转单词strs += ' '    # 在单词后面补充空格start = i + 1elif i == len(st) - 1:strs += reverse_str(st[start:i + 1])  # 反转最后一个单词i += 1return strs

三、其他

第一题

Leetcode13. 罗马数字转整数:简单题 (详情点击链接见原题)

罗马数字包含以下七种字符: IVXLCDM

解题思路:
贪心:我们每次尽量使用最大的数来表示,比如 1994 这个数,一次选 1000, 900, 90, 4,会得到正确结果 MCMXCIV
python代码解法:

class Solution:def romanToInt(self, s: str) -> int:hash_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}pre_num = hash_map[s[0]]total = 0for i in range(1, len(s)):cur_num = hash_map[s[i]]if pre_num < cur_num:  # 当小值在大值的左边,则减小值total -= pre_numelse:  # 当小值在大值的右边,则加小值total += pre_numpre_num = cur_numtotal += pre_numreturn total

第二题

Leetcode12. 整数转罗马数字:中等题 (详情点击链接见原题)

罗马数字包含以下七种字符: IVXLCDM

python代码解法:

class Solution:def intToRoman(self, num: int) -> str:hash_map = {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'}res = ''for key in hash_map:if num // key != 0:remain = num // key  # 提取最高位res += hash_map[key] * remainnum %= keyreturn res

第三题

Leetcode1419. 数青蛙:中等题 (详情点击链接见原题)

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak”
请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目

  • 遍历到c时,看看有没有青蛙刚才发出了k的声音,如果有则复用这只青蛙
  • 遍历到r时,看看有没有青蛙发出c的声音,如果有则复用,否则产生一只新的青蛙从c开始蛙鸣(如果不是从c开始蛙鸣则终止),其余同理
  • 遍历结束后,所有青蛙必须在最后发出 k 的声音,如果有青蛙在最后发出的声音不是 k 则返回 -1,返回counter[k]即最小的青蛙数目

python代码解法:

class Solution:def minNumberOfFrogs(self, croakOfFrogs: str) -> int:counter = Counter()previous = {'c': 'k', 'r': 'c', 'o': 'r', 'a': 'o', 'k': 'a'}for i in croakOfFrogs:pre = previous[i]if counter[pre]:	# 遍历到i时,看看发出前一种声音的青蛙能不能复用counter[pre] -= 1elif i != 'c':		# 如果不能复用则青蛙必须从'c'开始蛙鸣return -1counter[i] = counter.get(i, 0) + 1for ch in "croa":if counter[ch] != 0:return -1return counter['k']

总结

本文介绍了面试中喜欢考的与数组和字符串相关的面试题型,提供了每道题的 python解法,面试加油,冲~

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

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

相关文章

深入学习和理解Java NIO的高级特性

学习使用Path、Paths和Files类来操作文件系统 在Java 7引入的NIO.2&#xff08;New Input/Output 2&#xff09;中&#xff0c;Path、Paths和Files类是处理文件系统操作的核心类。它们提供了一套强大的文件I/O操作接口&#xff0c;使得读写文件、访问文件属性、遍历文件目录等…

解锁基于LLMS的咒语:通过上下文学习重新思考对齐

一、写作动机&#xff1a; 最近的一项研究&#xff0c;LIMA&#xff0c;表明仅使用1K个示例进行SFT也可以实现显著的对齐性能&#xff0c;这表明对齐微调的效果可能是“表面的”。&#xff08;知识和推理能力来源于预训练&#xff0c;而不是必须通过对齐微调获得的。&#xff…

计算机图形学学习(一)——线的绘制、三角形填充绘制

以下摘抄自本人的计算机图形学上机报告 实验内容及要求&#xff1a; 理解并掌握中点画线法、Bresenham算法、扫描线法和重心坐标法的基本原理和算法步骤。使用编程语言C实现上述算法&#xff0c;并编写相应的代码。对于直线绘制算法&#xff0c;要求能够绘制水平、垂直、斜向等…

Python助力:高效合并多个Word文档

目录 写在开头1 准备工作1.1 安装Python环境1.2 安装必要的库 2 理解Word文档的结构2.1 python-docx库的基本使用2.2 文档基本组成2.2.1 段落2.2.2 表格2.2.3 图片2.2.4 页眉和页脚 3 编写合并Word文档的脚本3.1 创建新的Word文档3.2 读取并合并文档内容3.2.1 合并段落3.2.2 合…

【消息队列开发】 实现内存加载

文章目录 &#x1f343;前言&#x1f333;实现思路&#x1f6a9;读取消息长度&#x1f6a9;读取相应长度的消息&#x1f6a9;进行反序列化&#x1f6a9;判定是否有效&#x1f6a9;加入有效消息&#x1f6a9;收尾工作&#x1f6a9;代码实现 ⭕总结 &#x1f343;前言 本次开发目…

未解决的问题:字符数组中元素的个数

情形1&#xff1a; #include<stdio.h> int main() {int arr_int1[10];int arr_int2[]{1,2,3,4,5};char arr_char1[10];char arr_char2[]"world";char arr_char3[]{h,e,l,l,o};int i;i0;while(arr_char2[i]!\0){i;}printf("%d\n",i);i0;while(arr_ch…

mediapipe最小编译、插件开发及demo

mediapipe最小编译、插件开发及demo 1.创建容器2.修改apt源3.安装依赖4.安装conda环境5.安装cmake6.安装bazel7.安装Opencv(非必须)8.下载 mediapipe 0.8.119.编译最简版本的mediapipe10.拷贝编译好的库和头文件11.sample插件的参数12.插件源码13.编译插件14.demo源码15.编译de…

C语言顺序、选择、循环结构与预处理

C语言程序设计&#xff0c;知识一遍过 &#x1f525;温馨提示&#x1f525;&#xff1a;使用电脑端阅读&#xff0c;获取更好体验&#x1f680; 【参考】C 语言教程 | 菜鸟教程 (runoob.com) 文章目录 C语言程序设计&#xff0c;知识一遍过顺序结构表达式语句字符的输入与输出格…

lwip优化任务优先级

在lwIP中&#xff0c;ethernetif_input线程负责接收和处理从以太网接口接收到的数据包&#xff0c;而tcpip主线程则负责处理lwIP协议栈中的各种事件和数据包。一般情况下&#xff0c;ethernetif_input线程的优先级应该设置为低于tcpip主线程的优先级。 这是因为在实时操作系统…

HarmonyOS ArkUI入门—HarmonyOS ArkUI来开发一个健康饮食应用

本文演示如果在DevEco Studio 3里面&#xff0c;用HarmonyOS的ArkUI来开发一个健康饮食应用。体验HarmonyOS 3最新API 9&#xff01; 获取HarmonyOS应用 HarmonyOS的ArkUI来开发一个健康饮食的ArkUI程序“ArkUIHealthyDiet”&#xff0c;基础代码已经有了[1]&#xff0c;个人…

20 OpenCV像素重映

文章目录 像素重映remap 重映算子代码示例 像素重映 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去&#xff0c;形成一张新的图像。 g(x,y)是重映射之后的图像&#xff0c;h(x,y)是功能函数&#xff0c;f是源图像 remap 重映算子 Remap…

Java项目:52 springboot基于SpringBoot的旅游网站的设计与实现013

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 旅游网站主要功能如下&#xff1a; 1.用户管理&#xff1a;注册、登录、退出、修改密码&#xff1b; 2.分类显示&#xff1a;显示旅游路线的分类&am…

MD5算法:密码学中的传奇

title: MD5算法&#xff1a;密码学中的传奇 date: 2024/3/15 20:08:07 updated: 2024/3/15 20:08:07 tags: MD5起源算法原理安全分析优缺点比较技术改进示例代码应用趋势 MD5算法起源&#xff1a; MD5&#xff08;Message Digest Algorithm 5&#xff09;算法是由MIT的计算机…

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI /…

Python QT 之PySide6简单入门

目录 1.开发环境配置 1.1 下载PySide6 2.2 配置pycharm相关快捷方式 PySide6_Designer - QT Designer 设计UI PySide6_UIC - 将QT Designer生成的UI文件转换为python文件 PySide6_RCC - 将RCC文件转换为python文件 2.第一个开发实例 2.1 QT desiger设计界面 2.2 将ui文…

21.AUTOSAR MCAL分析(二):Memory Driver

目录 1. AUTOSAR Memory Driver模块概述 2. Flash Driver 3. EEPROM Driver 4. Flash Test 5. RAM Test 6.小结

一篇普通的生活周记

学习进度汇报&#xff1a; 这周主要是参考着视频敲完了一个vue2后台项目&#xff0c;主要是vue2element-ui,因为之前写项目的时候用过lay-ui&#xff0c;虽然是结合着node.js写的&#xff0c;但是大差不差&#xff0c;所以上手也很快。同时&#xff0c;学长发给我们了ruoyi项目…

关于如何重燃学习的激情

3月1日是我回学校的第一天。经历了长达8个月在家的昏暗时刻&#xff0c;我这10天的感觉和在家的感觉发生了翻天覆地的变化&#xff0c;最明显的莫过于学习状态的改变。 倒不是说在家学的不好&#xff0c;而是说在学校&#xff0c;我对学习的整体感觉&#xff0c;以及专注程度&…

【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)

1. 题目解析 题目链接&#xff1a;206. 反转链表 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、递归函数的核心任务 递归函数的主要职责是接受一个链表的头指针&#xff0c;并返回该链表逆序后的新头结点。递归…

【LeetCode热题100】160. 相交链表(链表)

一.题目要求 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数…