2020/3/10学习笔记-day15

java-day15

目录

回旋数字

规律

代码

可变参数

方法中只有一个可变参数,没有其他参数

可变参数与其他参数共存

实例


回旋数字

规律

1.矩阵的行数和列数就是我们的参数

例如:参数是3,那么矩阵就是3行3列

2.矩阵中的数字,最大是参数的平方

例如:参数是5,那么矩阵中最大的数字就是25

3.矩阵中的数字的排列是有规律,从1到参数的平方,然后转着圈圈回旋输出

例如:参数是3 1 2 3 8 9 4 7 6 5

4.数字从小到大,输出的模式有四种

4.1 从左往右 → 模式0 4.2 从上往下 ↓ 模式1 4.3 从右往左 ← 模式2 4.4 从下往上 ↑ 模式3

5.数字输出的四种模式之间也有关系

在当前模式下,满足某一个【条件】后,输出的模式就要变化(回旋) 变化的规律: 模式0如果需要转变模式,那么一定是转为模式1 模式1如果需要转变模式,那么一定是转为模式2 模式2如果需要转变模式,那么一定是转为模式3 模式3如果需要转变模式,那么一定是转为模式0

6.我们可以把这个矩阵,想象成在一个二维数组中

例如:这个参数为5的矩阵 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

矩阵在二维数组中: int arr = { {1, 2, 3, 4, 5}, {16, 17, 18, 19, 6}, {15, 24, 25, 20, 7}, {14, 23, 22, 21, 8}, {13, 12, 11, 10, 9} };

然后可以把这个二维数组想象成这个样子:

| 0 1 2 3 4 ------------------------- Y坐标 0 | 1 2 3 4 5 1 | 16 17 18 19 6 2 | 15 24 25 20 7 3 | 14 23 22 21 8 4 | 13 12 11 10 9 | X坐标

7.基于上面第六个点的分析结果,代码如下

代码

 
//回旋数字
public void test1(int size){
    //一个size行size列的矩阵(二维数组)
    int[][] arr = new int[size][size];
​
    int maxValue =  size*size;
​
    //当前数字输出的模式,分别有0 1 2 3
    //0模式 从左到右
    //1模式 从上到下
    //2模式 从右到左
    //3模式 从下到上
    int mode = 0;
​
    //这个矩阵中的每个位置的坐标
    //注意,这个矩阵其实就是我们操作的二维数组
    int x = 0;
    int y = 0;
​
    //构造二维数组,并且给每个位置赋值
    //变量i从1开始,最大值到maxValue
    //[1,maxValue]就是每次在循环中需要放到数组arr中的一个值
    //从1到maxValue,把值放完之后,arr数组刚好放满
    for(int i=1;i<=maxValue;i++){
        //在循环中,我们需要安装相应的规律,
        //找到每个数字应该放在arr数组中的一
        //个合适的位置,然后将其放入
​
        //这里是思路是先给位置赋值,然后根据模
        //式来判断下一个坐标应该怎么去变化,判
        //断完成后改变坐标(相当于这个游戏人物
        //在地图中又往前走了一个格子)
​
        //1 赋值
        arr[x][y] = i;
​
        //2 根据不同模式进行判断下一步怎么走
        switch(mode){
            
            //如果是模式0
            case 0:{
                //正常往前移动的模式0
                //当y坐标不是最大值 && y+1位置的值是0
                if(y!=size-1 && arr[x][y+1]==0){
                    y++;
                }
                //下一步需要转变为模式1
                else{
                    mode = 1;
                    x++;
                }
                break;
            }
                
            case 1:{
                //正常往前移动的模式1
                //当x坐标不是最大值 && x+1位置的值是0
                if(x!=size-1 && arr[x+1][y]==0){
                    x++;
                }
                //下一步需要转变为模式2
                else{
                    mode = 2;
                    y--;
                }
                break;
            }
                
            case 2:{
                //正常往前移动的模式2
                //当y坐标不是0 && y-1位置的值是0
                if(y!=0 && arr[x][y-1]==0){
                    y--;
                }
                //下一步需要转变为模式3
                else{
                    mode = 3;
                    x--;
                }
                break;
            }
                
            case 3:{
                //正常往前移动的模式3
                //当x坐标不是0 && x-1位置的值是0
                if(x!=0 && arr[x-1][y]==0){
                    x--;
                }
                //下一步需要转变为模式0
                else{
                    mode = 0;
                    y++;
                }
                break;
            }
                
        }
    }
    //把构建好的二维数组,进行循环遍历输出
    for(int i=0;i<arr.length;i++){
        //输出每一行数字
        for(int j=0;j<arr[i].length;j++){
            System.out.print(arr[i][j]+"\t");
        }
        //输出一个换行
        System.out.println();
    }
}

可变参数

一种特殊的语法,表示方法的参数可以有不同的数量。

JDK1.5及以上版本支持

public void test(int [] a){
    
}

//在调用方法的时候,只能传一个数组对象作为参数
main:
    int [] arr={1,2,3};
    t.test(arr);
​
//如果使用可变参数,可以变成
public void test(int... a){
    
}
//在调用这种方法的时候,我们所传的参数就有多种选择了
 

方法中只有一个可变参数,没有其他参数

  

注意,在test方法中,这个可变参数a,其实就是一个int类型的数组,在方法中可以直接把a当做数组来使用,如果我们没有传任何参数,那么这个数组a的长度就是0,如果传1个参数,那么数组a的长度是1,数组里面的数据就是我们所传的参数,依次类推,传多个参数的情况也是类似的。额外的我们还可以把一个数组当做参数传进来,因为这个可变参数a在方法的本来就是一个数组,刚好可以接收我们传的参数

可变参数与其他参数共存

例如:

public void test(String str,int...a){
    
}

  

共存的时候可变参数必须放在最后的位置(否则编译报错) 

最多只能放一个可变参数(否则编译报错)

 

可变参数的每一个数据类型都必须相同

 

实例

public void test7(int... a){
            
            int begin = 1;
            int end = 100;
​
            int len = a.length;
            switch(len){
                case 0:{
                    break;
                }
                case 1:{
                    begin = a[0];
                    break;
                }
                case 2:{
                    begin = a[0];
                    end = a[1];
                    break;
                }
                default:{
                    System.out.println("所传参数过多,采用默认值");
                }
            }
​
            if(end < begin){
                
                throw new RuntimeException("参数传递有误,开始值不能超过结束值,当前开始为"+begin+"结束时为"+end);
            }
            int result = 0;
            for(int i=begin;i<=end;i++){
                result+=i;
            }
            System.out.println("from "+begin+" to "+end+" result="+result);
      }
 
 

发布了82 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/iostream992/article/details/104778974