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 
相关推荐
KANGBboy4 分钟前
java知识二(数组)
java·开发语言·python
零陵上将军_xdr7 分钟前
后端转全栈学习-Day3-JavaScript 基础-1
开发语言·javascript·学习
llilay10 分钟前
企业级FastAPI后端模板搭建(二)整合路由Router
开发语言·python·fastapi
汉克老师13 分钟前
GESP6级C++考试语法知识(三十九、动态规划的启蒙(四、二维DP))
c++·动态规划·dp·gesp六级·二维dp
QiLinkOS14 分钟前
QiLink 技术委员会选举实施细则
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
不会C语言的男孩17 分钟前
C++ Primer Plus 第13章:类继承
开发语言·c++
我材不敲代码17 分钟前
Python基础: 函数超全详解:定义、参数、返回值、作用域与递归
开发语言·python·算法
承渊政道18 分钟前
Linux系统学习【进程控制:进程创建、终止与等待、进程程序替换、自主shell命令行解释器详解】
linux·服务器·c++·学习·ubuntu·bash·远程工作
志起计算机编程19 分钟前
挖掘单节点Clickhouse极致性能上限
服务器·开发语言·python
Reisentyan20 分钟前
[Pro]GoLang Learn Data Day 5
开发语言·后端·golang