从外向内的旋转数组输出

2 篇文章 0 订阅

题目描述如下图:

 

解法一:

使用一个二维数组存储结果二维数组,然后输出此二维数组。时间复杂度O(n*n),空间复杂度O(n*n),此解法的C++代码如下:

#include<iostream>
using namespace std;

int main()
{
    int side_long;    //矩阵的边长
    cout<<"please input the length of edge"<<endl;
    cin>>side_long;
    int number_of_elements=side_long*side_long; 
    int* result_array=(int*)malloc(number_of_elements*sizeof(int));   //用于存储二维数组
    int count=side_long-1;    //count代表从外圈到内圈的过程中,当前圈的边长
    int steps=1,i=0,j=0;     //steps表示当前遍历了多少个元素
    while(steps<=number_of_elements)
    {
        for(int right=0;right<count;right++)           //在当前圈,向右遍历count个元素
        {
            *(result_array+i*side_long+j++)=steps++;
            if(steps>number_of_elements)
                break;
        }
        for(int down=0;down<count;down++)    //在当前圈,向下遍历count个元素
        {
            *(result_array+(i++)*side_long+j)=steps++;
            if(steps>number_of_elements)
                break;
        }
        for(int left=0;left<count;left++)    //在当前圈,向左遍历count个元素
        {
            *(result_array+i*side_long+j--)=steps++;
            if(steps>number_of_elements)
                break;
        }
        for(int up=0;up<count-1;up++)    //在当前圈,向上遍历count-1个元素
        {
            *(result_array+(i--)*side_long+j)=steps++;
            if(steps>number_of_elements)
                break;
        }
        *(result_array+i*side_long+j)=steps++;   //遍历当前圈的最后一个元素
        if(steps>number_of_elements)
            break;
        j++;
        count=count-2;    //向内圈转移
    }

    for(i=0;i<side_long;i++)   //输出最终的二维数组
    {
        for(j=0;j<side_long;j++)
        {
            cout<<"\t"<<*(result_array+i*side_long+j);
        }
        cout<<endl;
    }
    free(result_array);
    return 0;
}

 

解法二:

根据元素在二维矩阵中的位置索引来计算某个位置的值。不用存储二维结果数组,在从上到下,从左到右计算遍历某个位置时计算出该位置的值,并输出。时间复杂度O(n*n),空间复杂度O(1)。Python代码如下:

length_of_edge=input("Please input the length of edge:")   #矩阵边长的长度
max_perimeter=4*length_of_edge-4   #最外层圈的边长
for i in range(0,length_of_edge):
    for j in range(0,length_of_edge):   #遍历二维矩阵的每个位置(i,j)
        if i+j<=length_of_edge-1:      #副对角线线的左上方
            if i<=j:
                min=i
            else:
                min=j
            if min==0:
                front_perimeters=0  #front_perimeter代表当前位置所在圈之外那些圈边长的和
            else:
                front_perimeters=(2*max_perimeter-(min-1)*8)*min/2
            if(min==i):
                this_perimeter=j-i+1    #this_perimeter从当前圈的第一个元素(左上)开始到当前元素一共有多少个元素
            else:
                this_perimeter=max_perimeter-8*min-(i-j-1)
            number=front_perimeters+this_perimeter
            print "\t",number,
        else:   #副对角线的右下方
            if j>=i:
                max=j
            else:
                max=i
            if max==length_of_edge-1:
                front_perimeters=0
            else:
                front_perimeters=(2*max_perimeter-(length_of_edge-1-max-1)*8)*(length_of_edge-1-max)/2
            if(max==j):
                this_perimeter=length_of_edge-2*(length_of_edge-1-max)+(i+1)-(length_of_edge-1-max+1)
            else:
                this_perimeter=2*(length_of_edge-2*(length_of_edge-1-max)-1)+(length_of_edge-j-(length_of_edge-1-max))
            number=front_perimeters+this_perimeter
            print "\t",number,
    print


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值