需求1:
把一个数组的元素逆序交换, int[] a = { 5, 11, 15, 24, 36, 47, 59, 66 }; 交换元素后 int[] b = { 66 ,59 ,47 ,36 ,24,15 ,11 ,5 };
解答:
1.根据题目要求,要使a[i]存放到b[a.length-1]的位置。可以写一个for循环,使i从a.length-1开始减小直到0,把对应的按照索引从小到大的顺序依次数据放到b数组中。
代码实现:
package 数组.练习;
import java.util.Arrays;
import java.util.Collections;
public class demo4 {
public static void main(String[] args) {
int[] a ={1,23,4,24,224,9};
int[] b =new int[a.length];
int c=0;
System.out.println(Arrays.toString(a));
for (int i = a.length-1; i >=0 ; i--) {
b[i]=a[c++];
}
System.out.println(Arrays.toString(b));
}
}
运行结果:
2.java中有一个降序的方法,如果a数组的数据是从小到大排序的,可以直接用降序方法。
代码实现:
class method2 {
public static void main(String[] args) {
Integer[] arr={1,2,3,4,5,6,7,8};
for (int i:arr){
System.out.print(i+" ");
}
System.out.println();
Arrays.sort(arr, Collections.reverseOrder());
for(int i:arr){
System.out.print(i+" ");
}
}
}
运行结果:
需求2:
现在有如下一个数组:
int a[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
要求将以上数组中的0项去掉,将不为0的值存入一个新的数组.
解答:
1.要创建一个新数组,得先知道这个新数组的长度。首先要统计出旧数组非0项的个数,然后创建一个非0项长度的新数组,最后再把旧数组非0项依次存入新数组。
代码实现:
package 数组.练习;
import java.util.Arrays;
//现在有如下一个数组:
// int a[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
// 要求将以上数组中的0项去掉,将不为0的值存入一个新的数组.
public class demo5 {
public static void main(String[] args) {
int[] a={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
int zero= 0 ; // 统计0的个数
for ( int i= 0 ;i<a.length;i++){
if (a[i]== 0 ){
zero++;
}
}
int[] b=new int[a.length-zero];//新数组长度定义为旧数组长度减去zero
int c=0;
for (int i = 0; i < a.length; i++) {
if (a[i]!=0) {
b[c++] = a[i];//将旧数组非0项存入新数组,新数组索引自增
}
}
System.out.println("旧数组:"+Arrays.toString(a));
System.out.println("新数组:"+Arrays.toString(b));
}
}
运行结果:
2.为了节省空间,可以试着不创建新数组,直接提取出旧数组中的非0项(题目要求创建新数组,这里只是一种延伸方法,并不作答此题)。
代码实现:
class demo5_method2 {
public static void main(String[] args) {
int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
int[] arr = new int[oldArr.length];
int index = 0;
for (int i = 0; i < oldArr.length; i++) {
// 将当前元素不等于0的数,存入新数组
if (oldArr[i] != 0) {
arr[index] = oldArr[i];
index += 1;
}
}
System.out.println(Arrays.toString(arr));
System.out.println("数组中有 " + ((oldArr.length) - (index)) + "个0");
System.out.println("数组中不为0的数共有:" + index + " 个 ");
// 遍历获得不为0 的数的,新数组
for (int i = 0; i < index; i++) {
//我只输入大于0 的数
System.out.print(arr[i] + ",");
}
}
}
运行结果:
需求3:
定义一个长度为10的int数组,自定义一组数据,统计数组中的总和、平均值、最大值、最小值、以及奇数和偶数的个数.
解答:
1.可以先创建一个新数组(和旧数组等长),将旧数组从小到大排好序存放到新数组中,最大值就是新数组的最后一个数据,最小值就是第一条数据。然后遍历该数组,将遍历出的每一项相加就得到数组和,然后用数组和除以数组长度(设成double类型)就可以得到平均数。再遍历一次,如果能被2整除就是偶数,然后统计一次,遍历完就可以得到偶数个数,然后用数组长度减去偶数个数就可以得到奇数个数。
代码实现:
package 数组.练习;
import java.util.Arrays;
import java.util.Scanner;
import static sun.swing.MenuItemLayoutHelper.max;
//4.定义一个长度为10的int数组,自定义一组数据,统计数组中的总和、平均值、最大值、最小值、以及奇数和偶数的个数.
public class demo6 {
public static void main(String[] args) {
int[] a={3,42,52,39,18,38,57,15,18,32};
int[] b=array(a);//创建一个新数组b,用来存放排好序的数据
int max=0,min=0,avg=0,sum=0,odd=0,even=0;//odd:奇数,even:偶数
int c=a.length;
System.out.println(Arrays.toString(b));
System.out.println("a数组的元素总和为:"+Sum(b));
System.out.println("a数组的平均数为:"+(double)Sum(b)*1.0/b.length);
System.out.println("a数组中最大值为:"+b[b.length-1]);
System.out.println("a数组中最小值为:"+b[0]);
System.out.println("a数组中奇数个数为:"+get_odd(b));
System.out.println("a数组中偶数个数为:"+(c-get_odd(b)));
}
//定义一个array方法,用于从小到大排序数组
private static int[] array(int[] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1-i; j++) {
if (a[j]>a[j+1]){
int temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
return a;
}
private static int Sum(int[] a){
int num=0;
for (int i = 0; i < a.length; i++) {
num+=a[i];
}
return num;
}
private static int get_odd(int[] a){
int odd_number=0;
for (int i = 0; i < a.length; i++) {
if (a[i]%2!=0) {
odd_number++;
}
}
return odd_number;
}
}
运行结果:
2.其实,java中有一个sort方法,可以直接排序数组。为了节省空间,我们可以直接对旧数组进行排序,这样就减少了空间复杂度。
代码实现:
class demo6_method2 {
public static void main(String[] args) {
int[] a={3,42,52,39,18,38,57,15,18,32};
Arrays.sort(a);
int max=0,min=0,avg=0,sum=0,odd=0,even=0;//ocdd:奇数,even:偶数
int c=a.length;
System.out.println(Arrays.toString(a));
System.out.println("a数组的元素总和为:"+Sum(a));
System.out.println("a数组的平均数为:"+(double)Sum(a)*1.0/a.length);
System.out.println("a数组中最大值为:"+a[a.length-1]);
System.out.println("a数组中最小值为:"+a[0]);
System.out.println("a数组中奇数个数为:"+get_odd(a));
System.out.println("a数组中偶数个数为:"+(c-get_odd(a)));
}
private static int Sum(int[] a){
int num=0;
for (int i = 0; i < a.length; i++) {
num+=a[i];
}
return num;
}
private static int get_odd(int[] a){
int odd_number=0;
for (int i = 0; i < a.length; i++) {
if (a[i]%2!=0) {
odd_number++;
}
}
return odd_number;
}
}
运行结果:
3.通过分析可以知道,只需要遍历一遍数组,可以同时进行求数组和以及统计奇数偶数个数 ,这样可以降低时间复杂度。
代码实现:
class demo6_method3{
public static void main(String[] args) {
// int[] num=new int[] {64,91,96,82,94,67,91,90,83,76};
int[] num={1,2,3,4,5};
Arrays.sort(num);//进行排序
System.out.println(Arrays.toString(num));
int evensum=0,oddsum=0,sum=0,avg=0;
for(int i=0;i<num.length ;i++) {
sum+=num[i];
if(num[i]%2==0)evensum++;
else oddsum++;
}
System.out.println("数组总和为:"+sum);
System.out.println("数组平均数为:"+(double)sum*1.0/ num.length);
System.out.println("max="+num[num.length-1]+",min="+num[0]);
System.out.println("奇数的个数为:"+oddsum+",偶数的个数为:"+evensum);
}
}
运行结果: