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

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

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

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

             

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

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

                

现在就有了规律。

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

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

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

实现的函数代码如下:

 //判断N是偶数还是奇数,N为偶数时num=count,为奇数时num = count-1
public static void getArray(int num,int count){
ArrayList<ArrayList> listAll = new ArrayList<ArrayList>(count);//二维Arraylist
if(num != count){//奇数时先构建最核心的1
ArrayList start = new ArrayList(count);
start.add(1);
listAll.add(start);
}
for(int i=0;i<num/2;i++){
ArrayList listHead = new ArrayList();//构建要加的第一行
ArrayList listEnd = new ArrayList();//构建要加的最末行
int k;
if(num !=count)
k = 2*i+3;
else
k = 2*i+2;
for(int j=0;j<k;j++){
listHead.add(k*k-j);//填充要加的第一行
listEnd.add((k-2)*(k-2)+k-1+j);//填充要加的最末行
if(j<(k-2)){//原有的每行加头加尾
ArrayList listTem = new ArrayList();
listTem = listAll.get(j);
listTem.add(0,(k-2)*(k-2)+1+j);
listTem.add(k*k-k-j);
listAll.set(j,listTem);
}
}
listAll.add(0,listHead);//加入第一行
listAll.add(listEnd);//加入最末行
}
//输出
for(int i=0;i<count;i++){
ArrayList listTem = new ArrayList();
listTem = listAll.get(i);
for(Iterator iter = listTem.iterator();iter.hasNext();){
int lastValue = count*count+1 - (int)iter.next();
//没有标准化格式的输出
// System.out.print(lastValue+" ");
System.out.printf("%3d ",lastValue);
}
System.out.println();
}
}

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

java下蛇形回环矩阵的实现的更多相关文章

  1. segMatch:基于3D点云分割的回环检测

    该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...

  2. linux磁盘之回环设备

    为什么要讲回环设备,下面看下系统的采样情况 上面图有loop0,loop1等设备标记,这些是什么?看看下面fdisk -l 的结果,乱糟糟的一堆? 什么是回环设备? 上面的loop0, loop1就是 ...

  3. windows下使用wineshark分析抓取本地回环包

    ## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...

  4. ORB-SLAM(六)回环检测

    上一篇提到,无论在单目.双目还是RGBD中,追踪得到的位姿都是有误差的.随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大.除了利用优化方法在局部和 ...

  5. 回环栅栏CyclicBarrier

    通过它可以实现让一组线程等待至某个状态之后再全部同时执行.叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方 ...

  6. ​综述 | SLAM回环检测方法

    本文作者任旭倩,公众号:计算机视觉life成员,由于格式原因,公式显示可能出问题,建议阅读原文链接:综述 | SLAM回环检测方法 在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿 ...

  7. 关于STM32 CAN回环可用,正常不可用情况分析

    1.回环下应该与GPIO无关 2.GPIO是否初始化正确,时钟启用 3.是否复用,AFIO时钟是否启用 4.回环下是否有CAN_Tx应该有输出 5.终端电阻是否有 6.CAN收发器电路电压是否正常 7 ...

  8. thread_CyclicBarrier回环栅栏

    CyclicBarrier回环栅栏,字面意思是可循环使用(Cyclic)的屏障(Barrier).通过它可以实现让一组线程等待至某个状态之后再全部同时执行. 它要做的事情是,让一组线程到达一个屏障(也 ...

  9. VMware配置回环地址用于测试

           我们在开发过程中,很可能需要一台服务器用于测试,在这种环境下,我们很可能需要用到vmware来构建这样的开发环境.但如果当前处在一个离线,或是不在网内的环境下,我们所搭建的环境有可能无法 ...

随机推荐

  1. 计算两个date类型的时间差

    //两个时间之间分钟差 public static int compareDate(Date d1, Date d2) {        // TODO Auto-generated method s ...

  2. 解决Appium无元素可选的如何定位

    1.首先我们看看要定位的东西,我要定位的就是折让率上图自己看 写代码:   AndroidElement element = driver.findElementByAndroidUIAutomato ...

  3. C语言使用clock进行计时

    #include "stdio.h" #include "stdlib.h" #include "time.h" int main( voi ...

  4. JDK动态代理实现机制

    =========================================== 原文链接: JDK动态代理实现机制   转载请注明出处! =========================== ...

  5. [SinGuLaRiTy] 2017-03-30 综合性测试

    [SinGuLaRiTy-1014] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有的题目:Time Limit:1s  |  Me ...

  6. 【转】AS3操作XML,增加、删除、修改

    var i:Number=0;//用于下面循环 var webcontent:String="Sontin's Blog <b>Welcome to 终吾一生</b> ...

  7. 性能测试培训: 监控CPU之python

    性能测试培训: 监控CPU之python 作为一名测试开发工程师,开发脚本是为了测试服务的,我们在手里没有性能监控工具的情况下,我们会自己来进行开发脚本完成监控任务.下面是python监控cpu '' ...

  8. Android实现网络多线程断点续传下载

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...

  9. 1147: 零起点学算法54——Fibonacc

    1147: 零起点学算法54--Fibonacc Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 20 ...

  10. linux环境下安装jdk(本文示例是jdk1.6.0_export JAVA_HOME=/usr/java/jdk1.6.0_45 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar45)

    第一步:创建一个文件夹安装jdk(虽说地址一般自定义,但是为了方便查找请按照笔者建议目录 ):/usr/java 将jdk-6u45-linux-x64.bin文件放到   /usr/java 文件夹 ...