数组
定义一个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;
}
}
}
}
}