bilibili2019秋招策略算法笔试---顺时针打印数字矩阵

本文介绍了一个算法问题:如何按螺旋顺序打印矩阵。通过分析剑指Offer题目的核心思想,实现了一个C++程序,该程序能够接收多个矩阵作为输入,并以螺旋形式打印矩阵元素。特别注意了输入输出格式的要求。

题目:
这里写图片描述

剑指offer上有这个题核心思想的详细分析。但必须指出有所不同的是输入和输出格式,牛客网上的试题一般情况下都是写一个solution类就可以了,大多数不要求输入输出的格式。
哔哩哔哩的这个题,要求可以连续输入多个矩阵,直到输入-1,-1时,输入终止。
并且输出时要求最后的元素不带逗号,两个矩阵的打印序列要换行。
代码:

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
using namespace std;


int PrintMatrixInCircle(int** number, int rows, int columns, int start, int k)
{
    int endX = columns - 1 - start;

    int endY = rows - 1 - start;

    for (int i = start; i <= endX; ++i)
    {
        printf("%d", number[start][i]);
        k++;
        if (k != columns * rows)//输出时的逗号和换行操作
        {
            printf(",");
        }
        else
        {
            cout << endl;//用习惯了cin,cout
        }
    }
    if (start<endY)
    {
        for (int i = start + 1; i <= endY; ++i)
        {
            printf("%d", number[i][endX]);
            k++;
            if (k != columns * rows)
            {
                printf(",");
            }
            else
            {
                cout << endl;
            }
        }
    }

    if (start<endX &&start<endY)
    {
        for (int i = endX - 1; i >= start; --i)
        {
            printf("%d", number[endY][i]);
            k++;
            if (k != columns * rows)
            {
                printf(",");
            }
            else
            {
                cout << endl;
            }
        }
    }

    if (start<endX && start<endY - 1)
    {
        for (int i = endY - 1; i >= start + 1; --i)
        {
            printf("%d", number[i][start]);
            k++;
            if (k != columns * rows)//输出时的逗号和换行操作
            {
                printf(",");
            }
            else
            {
                cout << endl;
            }
        }
    }
    return k;
}

void PrintMatrixClockwisely(int** numbers, int columns, int rows, int k)
{
    if (numbers == NULL || columns <= 0 || rows <= 0)
    {
        return;
    }
    int start = 0;
    while (columns>start * 2 && rows>start * 2)
    {
        k = PrintMatrixInCircle(numbers, columns, rows, start, k);//判断是否是矩阵最后一个打印元素的关键一步。
        ++start;
    }
}



int main()
{
    int *m, *n;
    int k = 0;
    int temp = 0;
    m = (int*)malloc(10000);
    n = (int*)malloc(10000);
    int ***number = (int***)malloc(10000);//为了存储多个矩阵,并循环打印
    while (scanf_s("%d" "%d", &m[temp], &n[temp]) != EOF)
    {
        if (m[temp] == -1 && n[temp] == -1)
        {
            break;
        }
        number[temp] = (int**)malloc(m[temp] * sizeof(int*));
        if (number == NULL)
        {
            exit(-1);
        }
        for (int i = 0; i<m[temp]; i++)
        {
            number[temp][i] = (int*)malloc(n[temp] * sizeof(int));
            if (number[temp][i] == NULL)
            {
                exit(-1);
            }
        }

        for (int i = 0; i<m[temp]; i++)
        {
            for (int j = 0; j<n[temp]; j++)
            {
                scanf_s("%d", &number[temp][i][j]);
            }

        }
        temp++;
    }

    for (int i = 0; i < temp; i++)
    {
        PrintMatrixClockwisely(number[i], m[i], n[i], k);

        for (int j = 0; j<m[i]; j++)
        {
            free(number[i][j]);
            number[i][j] = NULL;
        }
        /*for (int j = 0; j<m[i]; j++)
        {
            free(number[j]);
            number[j] = NULL;
        }*/

    }
    free(number);
    number = NULL;
    system("pause");
    return 0;
}
/*测试用例
4 4
1 2 3 4
3 4 5 6
5 6 7 8
7 8 9 0
3 3
1 2 3
4 5 6
7 8 9
-1 -1
*/
当前提供的引用内容并未涉及哩2025年的Java面试题相关内容。然而,可以基于已有信息推测可能的题目方向以及常见的考察知识点。以下是综合现有参考资料得出的回答: ### 常见Java面试题方向 #### 1. **基础概念** - Java中的`final`关键字有哪些作用?[^3] - `String`对象为什么是不可变的?其底层实现是什么样的?[^5] #### 2. **并发编程** - 解释一下`synchronized`和`ReentrantLock`的区别及其适用场景。[^1] - 如何解决线程安全问题?请举例说明。 #### 3. **JVM原理** - JVM内存模型是如何划分的?每部分的作用分别是什么? - 发生OOM(OutOfMemoryError)的原因有哪些?如何排查? #### 4. **数据库与缓存** - MySQL索引的工作机制是什么?B+树结构的特点有哪些? - Redis支持的数据类型有哪些?它们各自的应用场景是什么? #### 5. **框架相关** - Spring AOP的核心原理是什么?动态代理和静态代理有什么区别?[^2] - Dubbo的服务治理流程包括哪些环节?ZooKeeper在其中起到什么作用? #### 6. **算法与数据结构** - 实现二叉树的层序遍历算法。 ```python from collections import deque def level_order_traversal(root): result = [] if not root: return result queue = deque([root]) while queue: current_level_size = len(queue) current_level_nodes = [] for _ in range(current_level_size): node = queue.popleft() current_level_nodes.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(current_level_nodes) return result ``` #### 7. **刷题策略** - 刷题阶段应重点关注实际工作中常用的技术点,而非过度关注复杂的智力题或冷门算法。[^4] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值