zoukankan      html  css  js  c++  java
  • 面试题20:顺时针打印矩阵

    题目描述

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

    例如:如果输入如下矩阵:

    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

    题目分析

    解决这个问题的关键在于先要形成清晰的思路,并把复杂的问题分解成若干个简单的问题。主要考查应聘者的思维能力,能很快地找出其规律并写出完整的代码。当问题比较抽象时不容易理解时,可以试着画几个图形帮助理解,这样往往能更快地找到思路。

    分析循环结束的条件,实现函数printMatrixClockwisely;接着我们考虑如何打印一圈的功能,即如何实现printMatrixInCircle,我们要仔细分析打印每一步的前提条件,打印矩阵最里边一圈可能只需要三步、两步甚至一步。

    代码实现

    #include <stdio.h>
    void printMatrixInCircle(int** numbers, int columns, int rows, int start);
    
    void printMatrixClockwisely(int** numbers, int columns, int rows)
    {
    	if (numbers == NULL || columns <= 0 || rows <= 0)
    		return;
    	
    	int start = 0;
    	while (start * 2 < columns && start * 2 < rows)
    	{
    		printMatrixInCircle(numbers, columns, rows, start);
    		++start;
    	}
    }
    
    void printMatrixInCircle(int** numbers, int columns, int rows, int start)
    {
    	int endX = columns - 1 - start;
    	int endY = rows - 1 - start;
    
    	// 从左到右打印一行
    	for (int i = start; i <= endX; ++i)
    	{
    		int number = numbers[start][i];
    		printf("%d ",number);
    	}
    
    	// 从上到下打印一列
    	if (start < endY)
    	{
    		for (int i = start + 1; i <= endY; ++i)
    		{
    			int number = numbers[i][endX];
    			printf("%d ", number);
    		}
    	}
    
    	// 从右到左打印一行
    	if (start < endX && start < endY)
    	{
    		for (int i = endX - 1; i >= start; --i)
    		{
    			int number = numbers[endY][i];
    			printf("%d ", number);
    		}
    	}
    
    	// 从下到上打印一列
    	if (start < endY && start + 1 < endY)
    	{
    		for (int i = endY - 1; i >= start + 1; --i)
    		{
    			int number = numbers[i][start];
    			printf("%d ", number);
    		}
    	}
    }
    
    int main()
    {
    	int** a = new int*[4];
    	for (int k = 0; k < 4; k++)
    	{
    		a[k] = new int[4];
    	}
    	
    	// int a[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    	int index = 1;
    	for (int i = 0; i < 4; i++)
    	{
    		for (int j = 0; j < 4; j++)
    		{
    			a[i][j] = index++;
    		}
    	}
    
    	printMatrixClockwisely(a, 4, 4);
    	getchar();
    	return 0;
    }
  • 相关阅读:
    centos7环境下编译安装apache2.4.41匹配php-fpm模式
    centos7系统下elasticsearch7.5.1集群安装elasticsearch-jieba-plugin 7.4.2 和analysis-kuromoji 日语分词器
    解决pureftp目录无法显示的问题
    在django中使用celery异步任务和定时任务
    Django创建站点的基本步骤
    使用windows定时任务运行python脚本
    python对邮件的常用操作收邮件发邮件
    python操作拷贝excel到另外一个excel中
    centos7环境通过rpm包安装mysql8.0.19
    centos7环境编译安装python3.7.7和pipenv的简单使用
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4749593.html
Copyright © 2011-2022 走看看