01 Java基础语法—第 5 节数组

一、流程控制的逻辑训练任务

1、查找某个整数

问题描述

定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输 入一个整数,查找此整数,找到输出下标, 没找到给出提示。

代码

public class Test_2 {
    
    
	
	public static void main(String[] args) {
    
    
		int t = 0;//判断目标数组下标的标记
		
		Scanner input = new Scanner(System.in);
		System.out.println("请输入10个整数:");
		int[] nums = new int[10];//动态确定数组的个数
		
		for(int i = 0; i < 10; i ++) {
    
    
			nums[i] = input.nextInt();//动态对数组进行赋值
		}
		
		System.out.println("请输入一个整数:");
		int n = input.nextInt();
		
		for(int i = 0; i < 10; i ++) {
    
    
			//判断数组中是否有这个整数
			if(n == nums[i]) {
    
    
				t = i;//将下标值赋值给t
				System.out.println("整数 " + n + "在数组中下标为" + t);
				//break; //这里不能加break,有可能数组中存在重复的数据,这些数据也需要遍历。
			}
		}
		//判断数组中是否有这个整数
		if(t == 0) {
    
    
			System.out.println("数组中没有整数" + n);
		}
	}
}

运行结果:
在这里插入图片描述

2、找出数组的最值

问题描述

定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组 的最大值、最小值。

代码

import java.util.Scanner;
public class Test_3 {
    
    

	public static void main(String[] args) {
    
    
		
		System.out.println("请输入10个整数:");
		Scanner input = new Scanner(System.in);
		int[] nums = new int[10];
		
		for(int i = 0; i < nums.length; i ++) {
    
    
			nums[i] = input.nextInt();//对数组进行动态赋值
		}
		//假定数组下标为0 定为最值
		int max = nums[0];
		int min = nums[0];
		//判断数组的最值
		for(int i = 1; i < nums.length; i ++) {
    
    
			if(max < nums[i]) {
    
    
				max = nums[i];
			}
			if(min >nums[i]) {
    
    
				min = nums[i];
			}
		}
		System.out.println("数组的最大值为" + max);
		System.out.println("数组的最小值为" + min);
	}
}

运行结果:
在这里插入图片描述

3、两数之和

问题描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为 目标值的那两个整数,并输出他们的数组下标 假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例: 给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以输出 0,1

代码

public class Test_4 {
    
    

	public static void main(String[] args) {
    
    
		int[] nums = {
    
    2,11,15,7};
		int target = 9;
		
		boolean flag = false;
		
		T:for(int i = 0; i < nums.length; i ++) {
    
    
			for(int j = i + 1; j < nums.length; j ++) {
    
     // j从i+1开始 避免重复使用同一个值
				if(nums[i] + nums[j] == target) {
    
    
					System.out.println("满足两数之和的下标分别是:" + i + " 和  " + j);
					flag = true;
					break T;// 跳出最外层循环
				}
			}
		}
		// 未找到则给出提示
		if(flag == false) {
    
    
			System.out.println("未找到满足目标值的两个数组中整数。");
		}
	}
}

运行结果:
在这里插入图片描述

关键技巧

  • 若题目需要给出提示信息,都可以另设一个boolean变量来判断给出提示。

4、排序并查找

问题描述

对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并 输出排序后的下标。

代码

import java.util.Arrays;

public class Test_5 {
    
    

	public static void main(String[] args) {
    
    
		
		int[] nums = {
    
    1,3,9,5,6,7,15,4,8};//对数组静态初始化
		int target = 6;
		System.out.println("数组nums排序前:");
		for(int num : nums) {
    
    
			System.out.print(num + " ");
		}
		System.out.println();
		Arrays.sort(nums);//对输入的整数数组进行排序

		System.out.println("数组nums排序后:");
		for(int num : nums) {
    
    
			System.out.print(num + " ");
		}
		System.out.println();
		
		//采用二分查找法
		int minIndex = 0;
		int maxIndex = nums.length - 1;
		int midIndex = 0;
		
		//方法一:
		while(true) {
    
    
		 	midIndex = minIndex + ((maxIndex - minIndex) >>1);
			if(target > nums[midIndex]) {
    
    
				中间数据较大
				minIndex = midIndex + 1;
			}else if(target < nums[midIndex]) {
    
    
				//中间数据较小
				maxIndex = midIndex - 1;
			}else {
    
    
				//找到目标数据,数据位置:midIndex
				break;
			}
			
			if(minIndex > maxIndex) {
    
    
				//找不到目标数据,返回-1
				midIndex = -1;
				break;
			}
			
			
		}
		
		//方法二:不常用for循环。
		/*for( ;minIndex <= maxIndex; ) {
			midIndex = minIndex + ((maxIndex - minIndex) >>1);
			if(target > nums[midIndex]) {
				中间数据较大
				minIndex = midIndex + 1;
			}else if(target < nums[midIndex]) {
				//中间数据较小
				maxIndex = midIndex - 1;
			}else {
				//找到目标数据,数据位置:midIndex
				break;
			}
		}*/
		System.out.println("查找" + target + "整数位于数组下标的" + midIndex);
	}
}

运行结果:
在这里插入图片描述

5、移动零

问题描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保 持非零元素的相对顺序。
示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]

代码

public class Test_6 {
    
    

	public static void main(String[] args) {
    
    
		int temp = 0;//;临时存储,第三方变量
		System.out.println("请确定数组的长度值:");
		Scanner input = new Scanner(System.in);
		
		int n = input.nextInt();//数组的长度
		
		System.out.println("请对每个数组赋值:");
		int[] nums = new int[n];
		
		for(int i = 0; i < nums.length; i ++) {
    
    
			nums[i] = input.nextInt();//对数组动态初始化
		}
		System.out.println("数组nums遍历:");
		for(int num : nums) {
    
     //for-each遍历
			System.out.print( num + " ");
		}
		System.out.println();
		
		//方法一:引入第三方变量不断 双重循环 将0和后面元素进行比较。
		/*for(int i = 0; i < nums.length; i ++) {
			for(int j = i + 1; j <nums.length; j ++) {
				// 将0移动到数组的末尾
				if(nums[i] == 0 && nums[j] != 0) {
					temp = nums[i];
					nums[i] = nums[j];
					nums[j] = temp;
				}
			}	
		}
		System.out.println("移动之后的数组:");
		for(int num_1 : nums) {//遍历
			System.out.print(num_1 + " ");
		}*/
		
		//方法二:引入新的数组 依次按顺序 来存放旧数组非零的数据。
		int[] nums_2 = new int[n]; //调整后的新数组,接收非零的数据
		int index = 0; // 新数组下标的索引
		for(int i = 0; i <nums_2.length; i ++) {
    
     //nums_2数组初始化为0
			nums_2[i] = 0;
		}
		
		for(int i = 0; i < nums.length; i ++) {
    
     //将nums里不为0的元素依次放入nums_2中
			if(nums[i] != 0) {
    
    
				nums_2[index++] = nums[i];
			}
		}
		
		System.out.println("移动之后的数组:");
		for(int num_2 : nums_2) {
    
    //遍历
			System.out.print(num_2 + " ");
		}	
	}
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46312449/article/details/112414657
今日推荐