leetcode 数组和字符串

文章介绍了四种编程问题的解决方案:合并不重叠区间、零矩阵置零、遍历对角线顺序以及查找最长公共前缀。涉及列表排序、numpy替代、布尔标记和字符串比较等技术。
摘要由CSDN通过智能技术生成

 数组和字符串小册部分题目记录——

1.合并区间,用一个新的二维数组merged存结果,如果merged为空或区间没有重叠(merged最后一个元素的右边界<intervals元素们的左边界)就加入结果集,否则更新merged最后一个元素的边界

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        # 排序
        intervals = sorted(intervals, key = lambda x: x[0])
        merged = []
        for interval in intervals:
            if merged==[] or merged[-1][1]<interval[0]:  #当为空或区间没有重复时
                merged.append(interval)   # 加入
            else:  # 否则更新最新的区间右边界
                merged[-1][1] = max(interval[1], merged[-1][1])
        return merged

# print(Solution().merge([[1,3],[2,6],[8,10],[15,18]])) 测试数据

我的办法太笨了!!!!还是没有接触到问题本质,故不贴原代码,学习示例

2.零矩阵,把有0的行和列其他元素也转为0

import numpy as np
class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        list_matrix = np.array(matrix)
        for i in range(len(matrix)):
            for j in range(len(matrix[i])):
                a = list_matrix[i][j]    # 转成ndarray进行数组操作
                if matrix[i][j] == 0:
                    list_matrix[i, :] = 0
                    list_matrix[:, j] = 0
        matrix = list_matrix
        return matrix
# 结果都对的不知道为啥到lc就不一样了

 应该是被禁用numpy了、、学学官方的

class Solution:
    def setZeroes(self, matrix):

        m, n = len(matrix), len(matrix[0])
        row, col = [False] * m, [False] * n    
         # 用布尔值做标签!!方便后续判断 同时也降维了

        for i in range(m):
            for j in range(n):
                if matrix[i][j] == 0:
                    row[i] = True   # 给行打标签
                    col[j] = True   # 给列打标签
        for i in range(m):
            for j in range(n):
                if row[i] or col[j]:  # 置零
                    matrix[i][j] = 0
        print(matrix)

3.遍历对角线

开始给我看迷糊了。。。总之是分类(向上遍历、向下遍历)找规律;从对角线第一个元素入手,再分类讨论在第一行/列和不在第一列的第一个元素的位置。结合画图、写坐标理解

class Solution:
    def findDiagonalOrder(self, mat):
        ans = []
        m, n = len(mat), len(mat[0])  # m是行数,n是列数,i表示第几次遍历(第几条对角线)
        for i in range(m + n - 1):  # 看对角线第一个值确定有几条对角线
            if i % 2:       # 奇数向下遍历
                x = 0 if i < n else i - n + 1    # 如果不是第一行则-列数+1
                y = i if i < n else n - 1       # 如果不是第一行则-1
                while x < m and y >= 0:
                    ans.append(mat[x][y])
                    x += 1
                    y -= 1
            else:       # 偶数向上遍历
                # 三元表达式,i<m,x=i 否则x=m-1
                x = i if i < m else m - 1   # 从第一列开始遍历,如果不在第一列就从最后一行开始遍历
                y = 0 if i < m else i - m + 1       # 如果不在第一列则-行数+1
                while x >= 0 and y < n:     # 开始向上遍历,
                    ans.append(mat[x][y])
                    x -= 1
                    y += 1
        return ans

4.找最大前缀,可以用横向比较和纵向比较。此处为纵向比较,第一个字符串与其他字符串一一比较字符,直到比到有不同的字符跳出循环,返回位置

(是简单题又怎样,还是不会。。。)

class Solution:
    def longestCommonPrefix(self, strs):
        if not strs:   # 空字符返回""
            return ""

        length, count = len(strs[0]), len(strs)
        for i in range(length):
            c = strs[0][i]    # 都跟第一个字符串比较
            if any(i == len(strs[j]) or strs[j][i] != c for j in range(1, count)):  # 同列比较
                # j指除去第一个之外的字符串 i == len(strs[j]可以看做ture
                return strs[0][:i]

        return strs[0]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值