java矩阵数据回环_java下蛇形回环矩阵的实现

前文废话:这个问题据说是腾讯之前的一道笔试题,由于当时没认真看,现在记不清这种矩阵是不是叫“蛇形回环矩阵”......请大家直接看图1,就是那个样子的矩阵。

问题描述:输入一个N,实现N×N的蛇形回环矩阵(即图1类型)

8c4b4420d890613bdeb74703a8a39776.png

(N=5时的蛇形回环矩阵)

我们先把N为奇数和N为偶数的情况分开。先来看N=3、5、7时的该类矩阵是什么情况:

60d278ebab770801e930dc386d1eb96d.png     

baf77dce8450b49c740199032cf4a62c.png       

3ec50b3a3f852a216e22c20ff1c0d60a.png

看上去彼此之间并无规律,对这道题最简单粗暴的解法似乎就是构建一个二维数组,然后按人的正常思维向里填数字构建。

但是——如果用(最大数+1)减去每个数,那么这三个矩阵就变成了:

f864cf4eabe0ac2e87a811271d063cc6.png             

e12f3091745bd7254a709a2fffa7f428.png  

d6b4260adc13c478b134d8de62be3cdd.png

现在就有了规律。

而N为偶数时,彼此之间也是这样的规律。

所以只要得到N=K-2时的矩阵,就能通过在原先的每行前添一列,后面添一列,然后上面添一行,下面添一行,就可以了。

为了实现这个能在前面插入的功能,构建二维的ArrayList。

实现的函数代码如下:

1 //判断N是偶数还是奇数,N为偶数时num=count,为奇数时num = count-1

2 public static void getArray(int num,intcount){3 ArrayList listAll = new ArrayList(count);//二维Arraylist

4 if(num != count){//奇数时先构建最核心的1

5 ArrayList start = newArrayList(count);6 start.add(1);7 listAll.add(start);8 }9 for(int i=0;i

11 ArrayList listEnd = new ArrayList();//构建要加的最末行

12 intk;13 if(num !=count)14 k = 2*i+3;15 else

16 k = 2*i+2;17 for(int j=0;j

19 listEnd.add((k-2)*(k-2)+k-1+j);//填充要加的最末行

20 if(j

21 ArrayList listTem = newArrayList();22 listTem =listAll.get(j);23 listTem.add(0,(k-2)*(k-2)+1+j);24 listTem.add(k*k-k-j);25 listAll.set(j,listTem);26 }27 }28 listAll.add(0,listHead);//加入第一行

29 listAll.add(listEnd);//加入最末行

30 }31 //输出

32 for(int i=0;i

39 System.out.printf("%3d ",lastValue);40 }41 System.out.println();42 }43 }

这里把N=偶数和N=奇数时分开构建开头的情况。其实就矩阵来看,N为偶数与N为奇数之间也可以通过矩阵转置来实现。但开头分开也比较简单实现,所以就用这种途径了。完整代码实现见github:https://github.com/Pengyiqing/java_practice

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值