c++面试题(14)------顺时针打印矩阵

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个元素。

例如:

bash 复制代码
输入矩阵:
[
 [ 1,  2,  3 ],
 [ 4,  5,  6 ],
 [ 7,  8,  9 ]
]

输出:[1,2,3,6,9,8,7,4,5]

解法思路:模拟边界遍历(按圈打印)

这是一个非常经典的二维数组模拟题。

🧠 思路总结:

我们可以把矩阵想象成一圈一圈的"洋葱",从最外层开始,顺时针打印每一圈的四条边:

  • 从左到右 打印上边;
  • 从上到下 打印右边;
  • 从右到左 打印下边;
  • 从下到上 打印左边;

每打印完一层就缩小一圈范围,直到所有元素都被访问。

实现代码

cpp 复制代码
#include <vector>
using namespace std;

class Solution {
public:
    vector< int > spiralOrder( vector< vector< int > >& matrix )
    {
        vector< int > result;
        if ( matrix.empty() )
            return result;

        int rows = matrix.size();
        int cols = matrix[ 0 ].size();

        // 定义当前圈的四个边界
        int top = 0, bottom = rows - 1;
        int left = 0, right = cols - 1;

        while ( top <= bottom && left <= right )
        {
            // 1. 从左到右
            for ( int i = left; i <= right; ++i )
            {
                result.push_back( matrix[ top ][ i ] );
            }
            top++;  // 上边界下移

            // 2. 从上到下
            for ( int i = top; i <= bottom; ++i )
            {
                result.push_back( matrix[ i ][ right ] );
            }
            right--;  // 右边界左移

            // 注意:可能只剩一行或一列的情况,需要判断是否还存在下边和左边
            if ( top <= bottom )
            {
                // 3. 从右到左
                for ( int i = right; i >= left; --i )
                {
                    result.push_back( matrix[ bottom ]`在这里插入代码片`[ i ] );
                }
                bottom--;  // 下边界上移
            }

            if ( left <= right )
            {
                // 4. 从下到上
                for ( int i = bottom; i >= top; --i )
                {
                    result.push_back( matrix[ i ][ left ] );
                }
                left++;  // 左边界右移
            }
        }

        return result;
    }
};

#include <iostream>

int main()
{
    vector< vector< int > > matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

    Solution sol;
    vector< int > result = sol.spiralOrder( matrix );

    cout << "顺时针打印结果:" << endl;
    for ( int num : result )
    {
        cout << num << " ";
    }

    return 0;
}

运行结果

bash 复制代码
顺时针打印结果:
1 2 3 6 9 8 7 4 5 
相关推荐
程序喵大人10 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng10 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
wdfk_prog11 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕11 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫12 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通12 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦13 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
qq_25183645714 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
野生风长14 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
FoldWinCard14 小时前
D6 Python 基础语法 --- 保留关键字
开发语言·python