数据结构基础训练

数组与字符串

一、一维数组

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

结果截图:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值