Java 上机作业2020.4.3

数组

定义一个MyArray类,要求如下。

属性:  int[] arr;   :一个1维数组

方法(所有方法不可以定义为static方法):

(1)  public void init(int n){…} :数组初始化;参数n表示存储空间个数。要求在方法中给数组分配存储空间,并从键盘输入数据给数组元素赋值。

(2)  public int max(){…}:求数组元素的最大值。

(3)  public int min(){…}:求数组元素的最小值。

(4)  public int sum(){…}:求数组所有元素之和。

(5)  public int avg(){…}:求数组所有元素的平均值。

(6)  public int print(){…}:输出数组每一个元素的值。

(7)  public  void inverse(){…}:把数组所有元素逆序存放,如{1,2,3,5,7,9,4}===>{4,9,7,5,3,2,1}

(8)  public void sort(){…}:对数组从小到大排序,(可使用冒泡排序或其他排序算法)

把 程序的代码  粘贴在下方的答题框中(不需要运行)

声明

排序使用的是二分排序(或者是快速排序?我也不太清楚)

代码

package game;

import java.util.Arrays;
import java.util.Scanner;

public class text {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        MyArray a = new MyArray(in.nextInt());
	a.print();
	System.out.println(a.max());
	System.out.println(a.sum());
	a.inverse();
	a.print();
	a.sort(0,a.right);
	a.print();
	in.close();
    }

}
class MyArray{
    private int arr[], Max = 0, Min = 99999, Sum = 0, Avg = 0, s = 0;
    int right ;
    public MyArray(int n) {
	super();
	this.arr = new int[n];
	Scanner in = new Scanner(System.in);
	for(int i: arr) arr[s++] = in.nextInt();
	right = arr.length -1;
	in.close();
	s = 0;
    }
    public int max() {
        for(int i: arr) if(arr[s] >= Max) Max = arr[s++];
	s = 0;
	return this.Max;
    }
    public int min() {
	for(int i: arr) if(arr[s] <= Min) Min = arr[s++];    
	s = 0;
	return this.Min;
    }
    public int sum() {
	for(int i: arr) Sum += arr[s++];
	s = 0;
	return this.Sum;
    }
    public int avg() {return sum()/arr.length;}
    public void print() {System.out.println(Arrays.toString(arr));}
    public  void inverse() {
        int j = this.arr.length, brry[] = new int[j];
	for(int i : arr) brry[--j] = arr[s++];
	arr = brry;
	s = 0;
    }
    public void sort(int left ,int right) {
	if (left >= right)
		return;
	int i = left;
	int j = right;
	int key = arr[left];
	while (i < j){
            while (i < j && key <= arr[j]) j--;
                arr[i] = arr[j];
		while (i < j && key >= arr[i]) i++;
        		arr[j] = arr[i];
	}
	    arr[i] = key;
	    sort(left, i - 1);
	    sort(i + 1, right);
    }
}

结论

在写的过程中发现

for(int i:arr)

这里的i是无法改变的(我也不知道为什么)所以需要引进其他变量进行移动arr数组的指向

杨辉三角(Pascal’s Triangle:

每行开始、结束的数都是1,中间的数等于它上方两数之和。

1

11

121

1331

14641

……

具体要求:

定义一个类(类名自拟),包括:

属性:1个整型的2维数组

方法:

      (1)    public void pascalTriangle(int n):形参n为要构造的杨辉三角的行数,方法中根据n的值创建二维数组的第一维空间,然后根据杨辉三角的特点分配第二维的长度(每行长度不同),并设置元素的值。

      (2)    public void print():输出该杨辉三角。

编写main方法:

创建一个刚才定义的类对象。

使用输入语句Scanner从键盘输入一个整数(杨辉三角的行数)

调用pascalTriangle方法建立创建杨辉三角

调用print方法输出该杨辉三角。

想法

这道题一看就感觉似曾相识所以联想到了动态规划,上次参加acm寒假训练营的时遇到过相似的题目(比这个难很多)

于是就打算借鉴2020牛客寒假算法基础集训营3-牛牛的DRB迷宫I的解析在写一次,复习一下动态规划

声明

杨辉三角这道题是用动态规划解决递归的繁杂,属于动态规划里最简单的方法

属于斐波那契数列的范畴

代码

package game;

import java.util.Scanner;
public class project {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
	int x=in.nextInt()+1,y=x;
	in.close();
	int a[][] = new int[y][];
	for(int i=0; i<y;i++) a[i] =new int[x];
	a[1][1]=1;
	int i,j;
	for (i = 1;i < y;i++)
    	    for (j = 1;j < x;j++)
	        a[i][j] += a[i - 1][j] + a[i][j - 1];
        int temp;
	for(j=1;j<y;j++) {
	    temp = j;
            for(i = 1; i<x;i++) {
		System.out.print(" "+ a[temp][i] +" ");
		if(temp-- == 1) {
	            System.out.printf("\n");
		    break;
		}
	    }
	}
    }
}
发布了12 篇原创文章 · 获赞 6 · 访问量 671

猜你喜欢

转载自blog.csdn.net/weixin_45696526/article/details/105295257