剑指offer_第19题_顺时针打印矩阵_Python

本文介绍了一种按顺时针方向从外向内打印矩阵的方法。通过定义一个Solution类及printMatrix方法,实现对矩阵元素的特定顺序遍历。同时介绍了reverse_matrix辅助方法,用于处理矩阵旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

  • 输入一个矩阵
  • 按照从外向里以顺时针的顺序依次打印出每一个数字
  • 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解题思路

思路1

class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        result = []
        while matrix:
            result += matrix.pop(0)
            if matrix:
                matrix = self.reverse_matrix(matrix)
        return result

    def reverse_matrix(self,matrix):
        row = len(matrix)
        col = len(matrix[0])
        new_matrix = []
        for i in range(col):
            new_line = []
            for j in range(row):
                new_line.append(matrix[j][col-i-1])
            new_matrix.append(new_line)
        return new_matrix
### 剑指Offer书籍主要内容 《剑指Offer》是一本专注于编程面试的经典书籍,涵盖了大量经典的算法和数据结构问[^3]。书中通过一系列精心设计的目,帮助读者深入理解和掌握各种常见算法及其应用场景。 #### 数据结构与基础算法 该书的基础部分主要围绕经典的数据结构展开讨论,包括但不限于链表、栈、队列以及二叉树等内容。例如,在处理链表时,《剑指Offer》提供了诸如“从尾到头打印单向链表”的解决方案[^4];而在探讨二叉树方面,则有“顺时针打印矩阵”、“二叉树的镜像”等问的具体分析方法[^2]。 #### 高级主与复杂度优化 随着内容推进,本书逐渐引入更复杂的概念和技术手段来解决问。比如,“最小的K个数”这一章节介绍了如何利用堆或者快速选择算法高效获取集合中小于指定数量的部分元素;还有关于动态规划的应用实例——“整数中1出现的次数”,它教会我们怎样通过状态转移方程减少不必要的计算量从而提升效率。 #### 实际应用案例研究 为了增强实战能力,《剑指Offer》还特别挑选了一些具有代表性的实际工程场景下的挑战作为练习素材。其中包括“扑克牌顺子”这样趣味性强又考察思维灵活性的小游戏型试[^2],也有类似于“孩子们的游戏(圆圈中最后剩下的数)”这种需要巧妙运用数学原理才能完美解答的大规模模拟类难[^4]。 --- ### 解思路举例说明 以下是几个典型例子及其对应的解策略: #### 示例一:二进制中1的个数 对于给定的一个整数,统计其二进制形式下有多少位为`1`。可以通过不断右移操作配合掩码检测每一位是否等于`1`完成计数过程。 ```python def count_ones(n): count = 0 while n != 0: count += (n & 1) n >>= 1 return count ``` #### 示例二:数值的整数次方 实现一个函数用于计算某个底数base以指数exponent相乘的结果。需要注意当指数小于零的情况特殊对待,并且考虑浮点误差带来的影响。 ```python def power(base, exponent): if base == 0 and exponent < 0: raise ValueError("Invalid input") abs_exponent = -exponent if exponent < 0 else exponent result = 1 for _ in range(abs_exponent): result *= base return 1 / result if exponent < 0 else result ``` #### 示例三:丑数 定义所谓的‘丑数’是指仅含质因子2、3或5的正整数序列中的某一项位置上的值是多少?采用动态规划的思想预先存储已知较小范围内的所有符合条件候选者再逐步扩展直至满足目标长度为止。 ```python def get_ugly_number(index): if index <= 0: return 0 ugly_numbers = [1] i2,i3,i5=0,0,0 next_multiple_of_2,next_multiple_of_3,next_multiple_of_5=2,3,5 while len(ugly_numbers)<index: min_val=min(next_multiple_of_2,next_multiple_of_3,next_multiple_of_5) ugly_numbers.append(min_val) if min_val==next_multiple_of_2:i2+=1;next_multiple_of_2=ugly_numbers[i2]*2; if min_val==next_multiple_of_3:i3+=1;next_multiple_of_3=ugly_numbers[i3]*3; if min_val==next_multiple_of_5:i5+=1;next_multiple_of_5=ugly_numbers[i5]*5; return ugly_numbers[-1] ``` --- ### 总结 通过对以上几大板块的学习与实践训练,可以有效提高个人解决各类计算机科学领域内核心理论及技术难点的能力水平。同时也能培养良好的编码习惯与严谨细致的工作态度,这对于准备求职尤其是针对互联网行业相关岗位而言至关重要[^1]^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值