学习内容

  1. 数组的形式,数组的内部存储结构

  2. 选择排序,冒泡排序,折半查找


课后作业

1.定义一个函数,函数功能是动态提取int[]中元素的最大值

2.定义一个函数,从数组中查询指定的元素首次出现的位置。

3.定义函数,完成冒泡排序,大数下沉。

4.折半查找。

5.阐述

6.定义一个函数,实现矩阵的转置.arr[i][j] == arr[j][i];//前提条件是正方的。

7.遍历三维组数,横向输出三维数组的每一个层。

8.定义一个类:Dog 有名称 color age cry();

9.阐述出来堆区,栈区,何时出现溢出,如何解决。

10.oop

解答:

1题答案:动态提取int[]中元素的最大值

class Demo{

    public static void main(String[] args){

        outResult(getMax(new int []{1,6,4,2}));

    }

    // 求出数组中最大值

    public static int getMax(int array[]){

        int temp = Integer.MIN_VALUE;


        if(array == null || array.length == 0){

            System.out.println("输入数组不合法");

            return 0;

        }

        for(int i = 0; i < array.length; i++){

            if(temp < array[i]){

                temp = array[i];


            }

        }

        return temp;

    }


    public static void outResult(int i){

        System.out.println(i);;

    }

}

2题答案:从数组中查询指定的元素首次出现的位置

class Demo{

    public static void main(String[] args){

        numLocation( 10, new int[]{1,6,4,5,8,3});

    }

    public static void  numLocation( int num , int arr[] ){

        for(int i = 0; i < arr.length; i++){

            if(num == arr[i]){

                System.out.println("该元素首次出现在第" + (i + 1) + "个位置");

                break;

            }else if( num != arr[i] && i == (arr.length - 1) ){

                System.out.println("该数组中不存在该元素");

            }

        }

    }

}

3题答案:冒泡排序,大数下沉

class Demo{

    public static void main(String[] args){

        outArr( bubbleSort(new int[]{ 3,6,10,9,2 }) );

    }

    public static int[] bubbleSort(int arr[]){

        for(int i = 0; i < arr.length ; i++){

            for(int j = 0; j < (arr.length - 1 - i); j++){

                int temp = 0;

                if(arr[j] > arr[j+1]){

                    temp = arr[j];

                    arr[j] = arr[j+1];

                    arr[j+1] = temp;

                }

            }

        }

        return arr;

    }

    public static void outArr( int arr[] ){

        for(int i= 0; i < arr.length; i++){

            System.out.print(arr[i] + " ");

        }

    }

}

4题答案:折半查找

class Demo{

    public static void main(String[] args){

        System.out.println(halfBind(new int[]{1,2,3,4,7,9,10},4));

    }

    //折半查找

    public static int halfBind(int arr[],int num){

        int a = 0, b = arr.length - 1, m = 0;

        int midIndex = 0; //中间数的下标

        while( a <= b ){

            midIndex = (a + b)/ 2;

            m = arr[midIndex];

            if( num == m ){

                return midIndex;

            }else if( num < m ){  //落在中间数的左边

                b = midIndex - 1;

            }else{                  //落在中间数的右边

                a = midIndex + 1;

            }

        }

        return -1;

    }

6.题答案: 转置矩阵

class Demo{

    public static void main(String[] args){

        int num = 1;

        int[][] arr = new int[4][4];

        for(int i = 0; i < arr.length; i++){

            for(int j = 0; j < arr[i].length; j++){

                arr[i][j] = num;

                num ++;

            }

        }

        outArr(tranArr(arr));

    }

    //转置矩阵

    public static int[][] tranArr(int arr[][]){

        int temp = 0;

        for(int i = 0; i < arr.length; i++){

            for(int j = i; j < arr[i].length; j++){

                temp = arr[i][j];

                arr[i][j] = arr[j][i];

                arr[j][i] = temp;

            }

        }

        return arr;

    }

    //输出矩阵

    public static void outArr( int arr[][] ){

        for(int i = 0; i < arr.length; i++){

            for(int j = 0; j < arr[i].length; j++){

                System.out.print(arr[i][j] + " ");

            }

            System.out.println();

        }

    }

}

7.题答案:横向输出三维数组的每一层

class Demo{

    public static void main(String[] args){

        outArr(getArr3_3_3());

    }

    //构造三维数组

    public static int[][][] getArr3_3_3(){

        int num = 1;

        int[][][] arr = new int[3][3][3];

        for(int i = 0; i < arr.length; i++){

            for(int j = 0; j < arr[i].length; j++){

                for(int k = 0; k < arr[i][j].length; k++){

                    arr[i][j][k] = num;

                    num ++;

                }

            }

        }

        return arr;

    }

    //输出矩阵  按列输出

    public static void outArr( int arr[][][]){

        // 依次找到各个层次

        for(int i = 0; i < arr.length; i++){

            // 找到第各个层次的第一行的各个列依次输出

            for(int k = 0; k < arr[i][0].length; k++){

                    System.out.print(arr[i][0][k] + " ");   

                }

            System.out.print("|" + "   ");       

        }

        System.out.println();

        for(int i = 0; i < arr.length; i++){

            // 找到第各个层次的第二行的各个列依次输出

            for(int k = 0; k < arr[i][1].length; k++){

                    System.out.print(arr[i][1][k] + " ");   

                }

            System.out.print("|" + "   ");       

        }

        System.out.println();

        for(int i = 0; i < arr.length; i++){

            // 找到第各个层次的第三行的各个列依次输出

            for(int k = 0; k < arr[i][2].length; k++){

                    System.out.print(arr[i][2][k] + " ");   

                }

            System.out.print("|" + "   ");       

        }

        System.out.println();

    }

}

spacer.gif

按行输出则直接遍历,更简单

8.创建Dog类

class Demo{

    public static void main(String[] args){

    Dog dog = new Dog();

    dog.setAge(3);

    dog.setColor("black");

    dog.cry();

    }

}

class Dog{

    private String color;

    private int age;

    public void setColor( String color ){

        this.color = color;

    }

    public String getColor(){

        return color;

    }

    public void setAge( int age ){

        this.age = age;

    }

    public int getAge(){

        return age;

    }

    public void cry(){

        System.out.println("汪汪汪");

    }

}   

9.阐述出来堆区,栈区,何时出现溢出,如何解决。

栈溢出情形:

当不断方法以递归的形式不断运行,压桟时往往就会发生栈溢出。

解决方式:当jvm内存足够时,可用java -Xss 来重新设置栈内存来解决

堆溢出情形:

当创建数组或对象等其他方式写入堆内存过大时,便会出现堆溢出。

解决方式:当jvm内存足够时,可用java -Xmx 来重新设置堆内存来解决


遇到的问题


1.定义一个函数,函数功能是动态提取int[]中元素的最大值

  • 提示编码gbk的不可映射字符      需要通过javac -encoding utf-8  Xxx.java 才能编译

          其实我们只要把notepad++语言设置成GBK中文形式就完美解决啦


  • 数组new的形式不对 

          数组的三种构造形式:

          int [ ]arr = new int[ 3 ];   int [ ]arr = new int[ ]{ 1,3,4,5 };   int[ ]arr = {1,4,2,5};

  • Integer.MIN_VALUE  写成Integer.min_value是不对的

2.选择排序一开始理解不是很透彻,多想想就很清楚了

3.在编译从数组中查询指定的元素首次出现的位置这个程序时,报错:

原来是缺失了int,应该是new int[ ]{1,3,5,2,9 };


class Demo{

    public static void main(String[] args){

        outResult(getSelectSort(new int []{1,6,4,2}));

    }

    // 选择排序

    public static int[] getSelectSort(int arr[]){

        for(int i = 0; i < arr.length; i++){

            // 获得数组当前值后面所有值中的最小值

            int min = Integer.MAX_VALUE;

            int num = 0;

            for(int j = i + 1; j < arr.length; j++){

                if(min > arr[j]){

                    min = arr[j];

                    num = j;

                }               

            }

            //判断 交换当前值与其后最小值的值与序号

            if(arr[i] > min){

                arr[num] = arr[i];

                arr[i] = min;

            }

        }

        return arr;

    }

    public static void outResult(int arr[]){

        for(int i = 0; i <  arr.length; i++){

            System.out.print(arr[i] + " " );

        }

    }

}

附老师代码:

class ArraySelectSort

{

    public static void main(String[] x){

        outArr(sort(new int[]{5,7,8,1,3,4,9}));

    }

    public static int[] sort(int[] arr){

        //迭代数组的每个元素

        for(int i = 0 ; i < arr.length ; i ++){

            //定义最小值

            int min = Integer.MAX_VALUE;

            int index = 0 ;

            //查找最小值以及最小值对应的下标

            for(int j = i + 1 ; j < arr.length ; j ++){

                if(min > arr[j]){

                    min = arr[j] ;

                    index = j ;

                    System.out.println(min);

                }

            }

            //完成当前元素和后续数组中最小的元素的对调.

            int xx = 0 ;

            if(arr[i] > min){

                //xx = arr[i] ;

                arr[index] = arr[i] ;

                arr[i] = min;

            }

        }

        return arr ;

    }

    public static void outArr(int[] arr){

        for(int i = 0 ; i < arr.length ; i ++){

            System.out.print(arr[i] + "  ");

        }

    }

}

4.在写for循环时经常直接写i = 0; 应该写成 int i = 0;

5.转置矩阵时总是转置的不全面

原因在于交换arr[i] [j]和和arr[j][i]的代码写的不对,另外注意第二层循环的起始位置

6.spacer.gif其实很简单,只是让每一行的行数和列数相等

7.在输出三维数组时报错,后发现getArr3*3*3( )这个标识符是不合法的

8.在创建Dog类时一直报错:

后来才发现多了一个(),而且class Dog是不能放在另一个class中的