09、数组操作练习题

09_数组操作练习题

1. 找出数组中指定元素第一次出现的下标位置
//1.找出数组中指定元素第一次出现的下标位置
public class Test1 {
	public static void main(String[] args) {
		//目标数组
		int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		
		//指定元素
		int num = 8;
		
		/*
		用于存储目标数据在数组中第一次出现的下标位置
		初始化为 -1
		如果找到目标数据后 下标 index 会被重新赋值
		如果找不到目标数据 下标 index = -1 是一个非法下标 可以判断数据不存在
		*/
		int index = -1;
		
		//循环遍历数组
		for (int i = 0; i < arr.length; i++) {
			//判断数组的元素是否指定的元素
			if (arr[i] == num) {
				index = i;
				
				//得到指定元素下标后结束循环
				break;
			}
		}
		
		if (index != -1) {
			System.out.println("目标数据下标:" + index);
		} else {
			System.out.println("没有目标数据");
		}
	}
}

运行结果如下图
1

2. 找出数组中指定元素最后一次出现的下标位置
//2. 找出数组中指定元素最后一次出现的下标位置
public class Test2 {
	public static void main(String[] args) {
		//目标数组
		int[] arr = {1, 2, 8, 4, 8, 6, 7, 8, 9, 10};
		
		//指定元素
		int num = 8;
			
		//定义一个变量用来存储指定元素最后一次出现的下标位置
		int index = -1;
		
		//倒序循环遍历数组
		for (int i = arr.length - 1; i >= 0; i--) {
			
			//判断数组的每一个元素是否是用户指定的元素 更新index的值
			if (arr[i] == num) {
				index = i;
				break;
			}
		}
		
		//如果 index != -1 表明数组中存在指定元素
		if (index != -1) {
			System.out.println("目标数据下标:" + index);
		} else {
			System.out.println("没有目标数据");
		}
		
	}
}

运行结果如下图
2

3. 数组元素逆序☆
要求:
	原数组:
		int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
	逆序之后:
		arr ===> {10, 8, 6, 4, 2, 9, 7, 5, 3, 1};

分析:
	1. 数据需要首尾交换
	2. 首尾交换 ==> 递进操作
	3. 交换数据的次数  ==> 元素个数 / 2 
//3. 数组元素逆序☆
public class Test3 {
	public static void main(String[] args) {
		int[] arr = {1, 3, 5, 7, 9, 2, 4, 6,8};
		
		//使用for循环 把数组的首尾元素值进行交换
		for (int i = 0; i < arr.length / 2; i++) {
			arr[i] = arr[i] + arr[arr.length - 1 - i];
			arr[arr.length - 1 - i] = arr[i] - arr[arr.length - 1 - i];
			arr[i] = arr[i] - arr[arr.length - 1 - i];
		}
		
		//循环遍历数组 输出所有元素
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

运行结果如下图
3

4. 复制数组数据到新数组☆
//4. 复制数组数据到新数组☆
//使用尾插法
public class Test4 {
	public static void main(String[] args) {
		//源数据数组
		int[] arr = {1, 3, 5, 7, 9, 2, 4, 6,8};
		
		//新数组
		int[] newArray = new int[arr.length];
		
		/*
		定义一个变量
			1、记录每一次存储数据的下标位置
			2、统计当前数组中有多少个元素
		*/
		int count = 0;
		
		//使用for循环 把 arr 中的元素按顺序依次赋值给 newArray
		for (int i = 0; i < arr.length; i++) {
			newArray[count] = arr[i];
			
			count++;
		}
		
		//循环遍历数组 输出所有元素
		for (int i = 0; i < newArray.length; i++) {
			System.out.println(newArray[i]);
		}
	}
}

运行结果如下图
4

5. 找出数组中的最大值下标位置
目标数组:
	int[] arr = {1, 3, 5, 7, 19, 2, 4, 6, 8, 10};
//5. 找出数组中的最大值下标位置
public class Test5 {
	public static void main(String[] args) {
		//目标数组
		int[] arr = {1, 3, 5, 7, 19, 2, 4, 6, 8,10};
		
		int index = 0;
		
		//循环遍历数组找到最大值下标位置
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] > arr[index]) {
				index = i;
			}
		}
		
		//控制台打印最大值下标
		System.out.println("最大值下标为:" + index);
	}
}

运行结果如下图
5

6. 找出数组中的最小值下标位置
目标数组:
	int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8, 10};
//6. 找出数组中的最小值下标位置
public class Test6 {
	public static void main(String[] args) {
		int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8,10};
		
		int index = 0;
		
		//循环遍历数组找到最小值下标位置
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] < arr[index]) {
				index = i;
			}
		}
		
		//控制台打印最小值下标
		System.out.println(index);
	}
}

运行结果如下图
6

7. 找出数组中指定下标元素☆
目标数组:
	int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8, 10};
/*
【重点】执行下标合法性判定!!!
	指定下标在合法范围以内,如果超出合法范围,提示用户操作错误!!!
*/
//7. 找出数组中指定下标元素☆
//下标不正确时给出错误反馈
public class Test7 {
	public static void main(String[] args) {
		int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8,10};
		
		//指定下标
		int index = 6;
		
		//用户指定下标合法性判断
		if (index < 0 || index > arr.length - 1) {
			System.out.println("用户提供的下标不合法");
			/*
			终止方法运行 因为当前没有返回值
			所以 return 之后没有任何东西
			*/
			return;
		}
		
		
		System.out.println(arr[index]);
		
	}
}

运行结果如下图
7

8. 在数组中指定下标开始,到指定下标结束,获取数据存储到新数组中
目标数组:
	int[] arr = {10, 13, 5, 7, 19, 2, 4, 6, 8, 10};
	指定开始下标 2 指定结束下标 6
	最终的新数组数据存储情况
	{5, 7, 19, 2};

问题:
	1. 新数组的容量如何得到?
        结束下标位置 - 开始下标位置
    2. 用户指定的下标位置是否存在隐患?
        最基本的以下条件【必须学会】
        begin 是开始下标 end 是结束下标
           1. begin > end 开始下标大于结束下标 【错误】
           2. begin > arr.length - 1 开始下标大于最大有效下标 【错误】
           3. end > arr.length - 1 结束下标大于最大有效下标 【错误】
           4. begin < 0 开始下标小于 0 【错误】
           5,end < 0 结束下标小于 0 【错误】
       	
        简化版条件牵制的情况
            1. begin > end 开始下标大于结束下标 【错误】
            2. begin < 0 开始下标小于 0 【错误】
            3. end > arr.length - 1 结束下标大于最大有效下标 【错误】

        if (begin > end || begin < 0 || end > arr.length - 1) {
            
        }
//获取数组从指定下标开始 到 指定下标的前一位结束 之间的数据存入新数组

//导包
import java.util.Arrays;

public class Test8 {
	public static void main(String[] args) {
		//源数据数组
		int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
		
		//指定开始下标
		int begin = 2;
		
		//指定结束下标
		int end = 6;
		
		//判断下标数据合法性
		if (begin > end || begin < 0 || end > arr.length - 1) {
			System.out.println("用户提供的下标不合法");
			/*
			终止方法运行 因为当前没有返回值
			所以 return 之后没有任何东西
			*/
			return;
		}
		
		//计算新数组容量
		int newCapacity = end - begin;
		
		//新数组用来存储获取到的元素
		int[] newArray = new int[newCapacity];
		
		//定义新数组下标变化
		int count = 0;
		
		for (int i = begin; i < end; i++) {
			newArray[count++] = arr[i];
		}
		
		//Arrays.toString()把数组转换成String类型输出
		System.out.println(Arrays.toString(newArray));
	}
}

运行结果如下图
8

9. 在数组指定下标位置添加元素☆
目标数组:	
	int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
	注意:
		1. 0 无效元素,仅占位使用
		2. 插入数据下标的位置必须在合法范围以内
		例如:
			添加指定元素 20 到下标为 5 的位置
			{1, 3, 5, 7, 9, 20, 11, 13, 15, 17};
//9. 在数组指定下标位置添加元素☆

import java.util.Arrays;

public class Test9 {
	public static void main(String[] args) {
		//此处 0 是无效元素 仅做占位使用
		int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17,0};
		
		//要添加的元素
		int num = 20;
		
		//指定下标位置
		int index = 5;
		
		//判断指定下标位置合法性
		if (index < 0 || index > arr.length - 1) {
			System.out.println("提供的下标数据不合法");
			//指定下标位置非法 终止程序
			return;
		}
		
		//循环遍历数组空出指定下标位置
		for (int i = arr.length - 1; i > index; i--) {
			/*
			arr[i] = arr[i] + arr[i - 1];
			arr[i - 1] = arr[i] - arr[i - 1];
			arr[i] = arr[i] - arr[i - 1];
			*/
			arr[i] = arr[i - 1];
		}
		
		//指定下标位置添加元素
		arr[index] = num;
		
		//Arrays.toString()把数组转换成String类型输出
		System.out.println(Arrays.toString(arr));
	}
}

运行结果如下图
9

10. 删除数组中指定下标元素内容☆
目标数组:
	int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
	注意:
		1. 0 是无效元素,仅占位使用
		2. 删除之后,要求数组元素向前移动
		3. 删除数据下标的位置必须在合法范围以内
		例如:
			删除指定下标 5 的元素
            {1, 3, 5, 7, 9, 13, 15, 17, 19, 0}
//10. 删除数组中指定下标元素内容☆

import java.util.Arrays;

public class Test10 {
	public static void main(String[] args) {
		int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17,19};
		
		//指定下标位置
		int index = 5;
		
		//判断指定下标位置合法性
		if (index < 0 || index > arr.length - 1) {
			System.out.println("提供的下标数据不合法");
			//指定下标位置非法 终止程序
			return;
		}
		
		/*
		用户通过指定下标删除元素内容,对于删除的元素并不知道数据内容
		如果可以获取被删除的数据,在已知下标位置的情况下,后期可以给予用户撤销操作
		*/
		int temp = arr[index];
		
		
		//使用 for 循环把数组元素前移
		for (int i = index; i < arr.length - 1; i++) {
			/*
			arr[i] = arr[i] + arr[i + 1];
			arr[i + 1] = arr[i] - arr[i + 1];
			arr[i] = arr[i] - arr[i + 1];
			*/
			arr[i] = arr[i + 1];
		}
		
		//删除元素后 末尾补 0 为无效元素 做占位使用
		arr[arr.length - 1] = 0;
		
		//Arrays.toString()把数组转换成String类型输出
		System.out.println(Arrays.toString(arr));
		
		System.out.println("被删除的数据为:" + temp);
	}
}

运行结果如下图
10

11. 找出数组中指定元素的所有下标位置☆
目标数组:
	int[] arr = {1, 3, 5, 1, 3, 5, 1, 3, 5};
	要求:
		1. 目标数据下标位置存储到另一个数组中
		例如:
			目标数据 1 
			存储下标的数组中内容 {0, 3, 6}
			
		2. 时间和空间效率问题
			如果准备的新数组和原数组容量一致,空间效率低,时间效率高
			如果根据当前目标数据个数准备数组,空间效率高,时间效率低
		3. 完整的思路 
			创建一个新数组容量与原数组一致。
//11. 找出数组中指定元素的所有下标位置☆
import java.util.Arrays;

public class Test11 {
	public static void main(String[] args) {
		int[] arr = {1, 3, 5, 1, 3, 5, 1, 3, 5};
		
		//指定元素
		int num = 1;
		
		
		//思路1 空间效率低,时间效率高
		int[] indexArray = new int[arr.length];
		
		//定义新数组下标从0开始存储数据
		int count = 0;
		
		//循环遍历数组找出指定元素的所有下标位置
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == num) {
				//尾插法
				indexArray[count++] = i;
			}
		}
		
		//根据 count 情况判断是否有对应数据存在
		if (count != 0) {
			for (int i = 0; i < count; i++) {
				System.out.println(indexArray[i]);
			}
		} else {
			System.out.println("查无数据");
		}
		
		/*
		//思路2 空间效率高 时间效率低
		//利用循环计数统计目标数的个数
		int count = 0;
		
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] == num) {
				count++;
			}
		}
		
		//判断是否需要创建数组
		if (0 == count) {// 0 == count 常量在前 错误响应更快 容错率更高
			System.out.println("查无数据");
			return;
		}
		
		//需要创建数组
		int[] indexArray = new int[count];
		
		count = 0;
		
		//使用循环存储下标位置
		for (int i = 0; i < arr.length; i++) {
			if (num == arr[i]) {
				indexArray[count++] = i;
			}
		}
		
		//展示数据
		for (int i = 0; i < count; i++) {
			System.out.println(indexArray[i]);
		}
		*/
	}
}

运行结果如下图
11

12. 使用新元素替换指定元素☆
目标数组:
	int[] arr = {1, 3, 5, 1, 3, 5, 1, 3, 5}
	例如:
		使用 10 替换 1 ==> {10, 3, 5, 10, 3, 5, 10, 3, 5};
//12. 使用新元素替换指定元素☆
import java.util.Arrays;

public class Test12 {
	public static void main(String[] args) {
		int[] arr = {1, 3, 5, 1, 3, 5, 1, 3, 5};
		
		//Arrays.toString() 把数组转换成 String 类型输出
		System.out.println(Arrays.toString(arr));
		
		//定义两个变量 一个对应原数据 一个对应新数据
		int oldNum = 1;
		int newNum = 10;
		
		//循环遍历数组
		for (int i = 0; i < arr.length; i++) {
			//判断是否是指定元素 找出指定元素下标位置
			if (arr[i] == oldNum) {
				//新元素替换指定元素
				arr[i] = newNum;
			}
		}

		//Arrays.toString() 把数组转换成 String 类型输出
		System.out.println(Arrays.toString(arr));
	}
}

运行结果如下图
12

13. 选择排序算法推演☆
目标数组:
	int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
13.1 找出数组中最大值和下标为0的元素交换位置☆
13.2 接上一题:找出数组中剩余最大值和下标为1的元素交换位☆
13.3 接上一题:找出数组中剩余最大值和下标为2的元素交换位☆
1. 找极值
	找出最大值所在下标位置
2. 换位置
	和指定位置数据交换
//选择排序算法
import java.util.Arrays;

public class Test13 {
	public static void main(String[] args) {
		//目标数组
		int[] arr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
		
		System.out.println(Arrays.toString(arr));
		
		//外层循环控制下标
		for (int i = 0; i < arr.length - 1; i++) {
			int index = i;
			
			//内层循环控制比较次数
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[j] > arr[index]) {
					index = j;
				}
			}
			
			//判断 当最大值下标不等于被交换元素的下标时 交换两个元素
			if (i != index) {
				arr[i] = arr[i] + arr[index];
				arr[index] = arr[i] - arr[index];
				arr[i] = arr[i] - arr[index];
			}
			
		}
		
		//打印数组
		System.out.println(Arrays.toString(arr));
	}
}

运行结果如下图
13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值