数组与字符串
一、一维数组
1.寻找数组的中心索引
题目描述:
一个整数数组 nums,编写一个能够返回数组 “中心下标” 的方法
数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和
如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个
解题方法:
① 我最初的想法比较直接,首先用for循环遍历数组,用 i 标记循环位置,然后利用 sum([:i]) 访问 i 之前的元素并求和,sum([i+1:]) 访问 i 之后的元素求和。若相等返回 i,遍历后不满足则返回-1。
(方法是可行的,但在LeetCode提交时超出了时间限制,说明效果很差)
② 首先还是遍历,但判断条件是利用 i 之前的元素之和 * 2 + i = 整个数组之和,减少了时间复杂度
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
left=0
for i in range(0,len(nums)):
if left*2+nums[i]==sum(nums):
return i
left+=nums[i]
return -1
结果截图:
2.搜索插入位置
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
如果目标值不存在于数组中,返回它将会被按顺序插入的位置。(假设数组中无重复元素)
解题方法:
首先遍历数组,判断数组元素是否大于等于目标值,是则返回索引。若均不满足,则返回数组长度。反向操作,若判断目标值是否大于数组元素再插入,会遇到边界问题难解决。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
for i in range(0,len(nums)):
if nums[i]>=target:
return i
return len(nums)
结果截图:
二、二维数组
3.旋转矩阵
题目描述:
由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。你设计一种算法,将图像旋转 90 度
(要求不占用额外内存空间)
解决方法:
开始还没有好的思路,看到别人的解题提示,先将矩阵对角翻转再y轴翻转,解题得先观察寻找规律,能达到用更容易方法解决。
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
l = len(matrix) # 一层时的数量
for i in range(l): # 对角对称翻转
for j in range(i,l):
matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
for i in range(l): # y轴对称翻转
matrix[i][:]=matrix[i][::-1]
结果截图:
4.零矩阵
题目描述:
若M × N矩阵中某个元素为0,则将其所在的行与列清零
解决方法:
①起初我只是利用二维数组寻找矩阵中某一为0的元素,将其行列变为0,但在循环的过程中,最终却将所有的元素变为了0。
②大佬提供的思路:既然打算将整行和整列清零,因此并不需要标记录它是cell[2][4](行2,列4),只需要知道行2有个元素为0,列4有个元素为0.不管怎样,整行和整列都要清零,又何必要记录零元素的确切位置?
也就是说,只需要知道某行某列有个元素为0,而不用一遍遍去循环的时候将其行列均变0,这样就避免让整个矩阵为0。
具体的思路是声明一个list用于存储二维数组中元素值为0的位置,然后在逐个遍历list中的子数组[行,列],根据子数组中的行,列值分别将原二维数组中的对应的行,列的元素全部置0 。
def setZeroes(matrix):
index = [] # 用于记录数组中元素值为0的位置
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]==0:
index.append([i,j]) # 假设[0,3]
for z in index: # 根据记录改动原矩阵的元素数值为0
for i in range(len(matrix[0])): # for i in range(4)
matrix[z[0]][i] = 0 # matrix[0][0~3] = 0 改变行 -> 0
for j in range(len(matrix)): # for j in range(3) 改变列 -> 0
matrix[j][z[1]] = 0 # matrix[0~2][3]
结果截图:
三、字符串
5.最长公共前缀
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
解决方法:
首先需要保证代码的鲁棒性,判断字符串是否为空。
核心思想在于先声明一个空数组和空字符串,遍历最短子串单个元素的同时,与其他子串同一位置的单个元素相比较,返回的bool值存在空数组里,遍历一次,若全部为true,则添加最短子串单个元素到空字符串里。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
# 判断字符串是否为空
if len(strs)==0:
return ''
elif len(strs) == 1:
return strs[0]
# 遍历字符串
else:
target = ''
s = sorted(strs, key=lambda x: len(x)) # 按子串长度从小到大排序
for i in range(len(s[0])):
l=[]
for j in s[1:]:
l.append(s[0][i]==j[i])
if all(l):
target+=s[0][i]
else:
break
return target
结果截图: