算法学习11-转圈打印数组

算法学习11-转圈打印数组

题目:

给定一个数组Array,请按照转圈的方向打印它。

例子:

算法学习11-转圈打印数组_第1张图片
打印结果:
打印结果
要求:
额外空间复杂度为O(1)。

图解算法

原数组内容如下:

算法学习11-转圈打印数组_第2张图片

打印方式如下:

算法学习11-转圈打印数组_第3张图片

算法实现

知道a[0][0]与a[3][3]就能成功的对a[4][4]这个数组的最外层进行标记,同样知道了a[1][1]与a[2][2]就能成功标记内层数组。这样就不用逐个考虑每个数组元素的坐标。成功标记后只需要对列与行进行加加减减就能成功转圈打印数组元素。

代码实现

将实现方法写在.h文件中。

#include
#include
using namespace std;

class RotationPrintArray{
    public:
        void printEdge(vector< vector<int> >m, int tR, int tC, int dR, int dC);
        void spiralOrderPrint(vector< vector<int> >matrix);
};

void RotationPrintArray::printEdge(vector< vector<int> >m, int tR, int tC, int dR, int dC) {
        if (tR == dR) { // 子矩阵只有一行时
            for (int i = tC; i <= dC; i++) {
                cout<<m[tR][i] + " ";
            }
        } else if (tC == dC) { // 子矩阵只有一列时
            for (int i = tR; i <= dR; i++) {
                cout<<m[i][tC] + " ";
            }
        } else {// 一般情况
            int curC = tC;
            int curR = tR;
            while (curC != dC) {
                cout<<m[tR][curC] + " ";
                curC++;
            }
            while (curR != dR) {
                cout<<m[curR][dC] + " ";
                curR++;
            }
            while (curC != tC) {
                cout<<m[dR][curC] + " ";
                curC--;
            }
            while (curR != tR) {
                cout<<m[curR][tC] + " ";
                curR--;
            }
        }
}

void RotationPrintArray::spiralOrderPrint(vector< vector<int> >matrix) {
    int tR = 0;
    int tC = 0;
    int dR = matrix.size()- 1;
    int dC = matrix[0].size() - 1;
    while (tR <= dR && tC <= dC) {
        printEdge(matrix, tR++, tC++, dR--, dC--);
    }
}

或者是将所有内容写在.cpp文件中

#include
using namespace std;
 
int A[10][10];
 
void EXPORT(int m)
{
    int n = 10-m;
    int i = m,j = m;
    while(j<n)
    {  
              cout<<A[i][j]<<" ";
              j++;
              }
    j--;
    while(i<n-1)
    {
              i++;
              cout<<A[i][j]<<" ";
              }
    while(j>m)
    {
              j--;
              cout<<A[i][j]<<" ";
              }
    while(i>m+1)
    {
              i--;
              cout<<A[i][j]<<" ";
              }
    }
int main()
{
    int num = 0;
    int m = 0;
    for(int i = 0;i<10;i++)
    {
            for(int j = 0;j<10;j++)
            {
               A[i][j] = num;
               num++;       
                    }
            }
    while(m<5)
    {
            EXPORT(m);
            cout<<endl;
            m++;     
              }
    return 0;
    }

你可能感兴趣的:(算法学习笔记)