黑马程序员技术交流社区
标题:
【黑马程序员】写一方法,打印等长的二维数组,要求从1...
[打印本页]
作者:
huburt
时间:
2016-5-20 22:20
标题:
【黑马程序员】写一方法,打印等长的二维数组,要求从1...
public static void main(String[] args) {
System.out.println("最后留下的是第" + play(100, 14) + "人。");
}
/**
* @param peoples
* 玩游戏的人数
* @param number
* 报的数字
* @return 最后留下一个人的序号
*/
public static Integer play(int peoples, int number) {
// 创建集合,赋值1~number的数字,代表玩游戏的人的序号
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= peoples; i++) {
list.add(i);
}
// 指针,代表报数的人的位置
int pointer = 0;
// 报数的数字
int count = 1;
// 游戏结束点:最后留下一个人
while (list.size() > 1) {
// 指针超过集合长度,表示完成1轮报数,第一个人继续报数
if (pointer == list.size()) {
// 指针回到第一个人
pointer = 0;
}
// 报数14,
if (count % number == 0) {
// 查看每一个报到指定数字的人
// System.out.println("退出的是第" + list.get(pointer) + "人");
// 报到指定数字的人退出游戏
list.remove(pointer);
// 有人退出,集合长度就会减少,原本退出位置的后一位向前移,因此还是从退出位置开始报数
// pointer++;//不需要!
// 重新从1开始报数
count = 1;
} else {
// 没有报到14的,指针往后移动
pointer++;
// 报数加1
count++;
}
}
//返回最后剩下的人的序号
return list.get(0);
}
public static void main(String[] args) {
//调用方法,获取数组并打印
printMetirx(getMetirx(4));
}
// 打印数组的方法
public static void printMetirx(int[][] metirx) {
// 二维数组实际上外层是一个数组的数组,元素是int[]数组
// 循环访问外层数组的元素
for (int i = 0; i < metirx.length; i++) {
// 访问到的外层数组的元素:int[]数组
// 在循环访问内层数组
for (int j = 0; j < metirx[i].length; j++) {
// 打印对应元素
System.out.print(metirx[i][j]);
// 添加空格
System.out.print("\t\t");
}
// 外层数组的元素单独显示一行,即一个int[]数组显示在一行
System.out.print('\n');
}
}
/**
* @param n 二维数组的大小
* @return int[n][n] 返回一个螺旋矩阵
*
* @author 思路:按“口”字形赋值,先给最外层一圈赋值,再给第二圈赋值....直至结束。
* 用上下左右四个顶点的位置来确定“口”的大小。
* 每次赋值完成一条边,对应的顶点往中心靠拢。
*/
public static int[][] getMetirx(int n) {
// 创建二维数组
int[][] metirx = new int[n][n];
// 赋值圈数
int count = (n + 1) / 2;
// 起始数
int start = 1;
// “口”字形圈的四个顶点
int left = 0, right = n - 1, top = 0, botton = n - 1;
// 赋值次数,即圈数
for (int i = 0; i < count; i++) {
// 给上边缘赋值,从左往右
for (int x = left; x <= right; x++) {
metirx[top][x] = start++;
}
// 上顶点往下移
top++;
// 给右边缘赋值,从上往下
for (int y = top; y <= botton; y++) {
metirx[y][right] = start++;
}
// 右顶点往左移
right--;
// 给下边缘赋值,从右往左
for (int x = right; x >= left; x--) {
metirx[botton][x] = start++;
}
// 下顶点往上移
botton--;
// 给左边缘复制,从下往上
for (int y = botton; y >= top; y--) {
metirx[y][left] = start++;
}
// 左顶点往右移
left++;
}
// 返回赋值完成的二维矩阵
return metirx;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2