• 面试题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;
    }
  • 相关阅读:
    PHP中判断变量为空的几种方法小结
    linux mysql字符编码问题
    php连接access数据库的三种方法
    js 一个关于图片onload加载的事
    shell脚本修复MySQL主从同步
    【Median of Two Sorted Arrays】cpp
    【Search In Rotated Sorted Array】cpp
    【Remove Duplicates from Sorted Array II】cpp
    【Remove Duplicates from Sorted Array】cpp
    Python刷题到底为止-开始cpp刷题
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4749593.html
Copyright © 2020-2023  润新知