java下蛇形回环矩阵的实现
前文废话:这个问题据说是腾讯之前的一道笔试题,由于当时没认真看,现在记不清这种矩阵是不是叫“蛇形回环矩阵”......请大家直接看图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下蛇形回环矩阵的实现的更多相关文章
- segMatch:基于3D点云分割的回环检测
该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...
- linux磁盘之回环设备
为什么要讲回环设备,下面看下系统的采样情况 上面图有loop0,loop1等设备标记,这些是什么?看看下面fdisk -l 的结果,乱糟糟的一堆? 什么是回环设备? 上面的loop0, loop1就是 ...
- windows下使用wineshark分析抓取本地回环包
## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...
- ORB-SLAM(六)回环检测
上一篇提到,无论在单目.双目还是RGBD中,追踪得到的位姿都是有误差的.随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大.除了利用优化方法在局部和 ...
- 回环栅栏CyclicBarrier
通过它可以实现让一组线程等待至某个状态之后再全部同时执行.叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方 ...
- 综述 | SLAM回环检测方法
本文作者任旭倩,公众号:计算机视觉life成员,由于格式原因,公式显示可能出问题,建议阅读原文链接:综述 | SLAM回环检测方法 在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿 ...
- 关于STM32 CAN回环可用,正常不可用情况分析
1.回环下应该与GPIO无关 2.GPIO是否初始化正确,时钟启用 3.是否复用,AFIO时钟是否启用 4.回环下是否有CAN_Tx应该有输出 5.终端电阻是否有 6.CAN收发器电路电压是否正常 7 ...
- thread_CyclicBarrier回环栅栏
CyclicBarrier回环栅栏,字面意思是可循环使用(Cyclic)的屏障(Barrier).通过它可以实现让一组线程等待至某个状态之后再全部同时执行. 它要做的事情是,让一组线程到达一个屏障(也 ...
- VMware配置回环地址用于测试
我们在开发过程中,很可能需要一台服务器用于测试,在这种环境下,我们很可能需要用到vmware来构建这样的开发环境.但如果当前处在一个离线,或是不在网内的环境下,我们所搭建的环境有可能无法 ...
随机推荐
- (转)centos6.5安装VNC
在Linux下用VNC远程桌面是个很不错的玩意.但在CentOS中默认没有安装VNC的.可以用下面语句查询,如果出现下面情况说明没有安装vnc #rpm -q tigervnc tigervnc-se ...
- Vue.js 2.2 卡片api
给vue开发者和爱好者发送点福利! 卡片上一共117个api,方便查阅 网址: https://vuejs-tips.github.io/cheatsheet Github: https://gith ...
- IOS-验证码的实现和封装(可以直接调用)
最近对OC中的图像比较感兴趣.随手搞得一个类似验证码的demo.直接贴代码了. 小demo中的VerificationCodeView是继承自UIView的,所以需要用到的时候,可以直接定义一个UIV ...
- [SinGuLaRiTy] 米勒罗宾素数判定法
[SinGuLaRiTy-1003] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 背景 数论学家利用费马小定理研究出了多种素数测试办法,M ...
- 3.Java集合总结系列:Set接口及其实现
一.Set接口 Set 接口与 List 接口相比没有那么多操作方法,比如: 1.List 接口能直接设置或获取某个元素的值,而Set接口不能. 2.List 接口能直接在指定位置删除.增加元素,而S ...
- SQL语句中的日期查询
我们先创建一个表: CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(10) NULL COMMEN ...
- JavaWeb总结(三)—JSP
一.JSP简介 1.基本认识 (1)JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp. (2)在JSP页面中编写的Java代码需要嵌套 ...
- jmeter 使用jmeter 录制 手机APP脚本
1.打开jmeter.鼠标右击工作台.添加HTTP代理服务器 2.设置配置jmeter.手机无线网络.(目标控制器也可以选择加到线程组中) 3.添加查看结果树 4.启动完成后.操作手机.jmeter就 ...
- 理解C++中的头文件和源文件的作用【转】
一.C++编译模式通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C+ ...
- Twitter数据抓取的方法(一)
Scraping Tweets Directly from Twitters Search Page – Part 1 Published January 8, 2015 EDIT – Since I ...