任务卡007:数组综合训练

看前须知

思路基本已经写在注释里了,有更多的想法会趁空闲的时候来尝试的,希望队友们也分享下自己的思路

1、查找某个整数

问题描述

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

代码

package collection_Task4;

import java.util.Scanner;

public class Test7_2 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		/*********************查找某个整数*********************/
		System.out.println("请输入10个整数:");
		int[] nums = new int[10];
		for(int i = 0;i < 10;i++) {	//录入数组的10个元素
			nums[i] = input.nextInt();
		}
		System.out.println("请输入要查找的整数:");
		int goal = input.nextInt();	//录入目标数字
		//是直接查找还是先排序后查找?
		for(int j = 0;j < 10;j++) {
			if( goal==nums[j] ) {
				System.out.println("目标数字在第" + (j+1) + "号位置");
				break;
			}else if( j == 9 ){
				System.out.println("目标数字不在数组中");
			}
		}
	}

}

运行结果截图

可以输些别的数字试

2、找出数组的最值

问题描述

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

代码

package collection_Task4;

import java.util.Scanner;

public class Test7_2 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		/*********************找最值*********************/
		System.out.println("请输入10个整数:");
		int[] nums = new int[10];
		for(int i = 0;i < nums.length;i++) {
			nums[i] = input.nextInt();
		}
		int max = nums[0];
		int min = nums[0];
		for(int j = 0;j < nums.length-1;j++) {
			if( nums[j]>max ) max=nums[j];
			if( nums[j]<min ) min=nums[j];
		}
		System.out.println("max→"+max);
		System.out.println("min→"+min);
	}

}

运行结果

在这里插入图片描述

3、两数之和

问题描述

给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并输出他们的数组下标。
假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。

示例:

给定nums=[2,7,11,15],target=9,
因为nums[0]+nums[1]=2+7=9,
所以输出0,1

代码

package collection_Task4;

import java.util.Scanner;

public class Test7_3 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		/*********************两数之和*********************/
		System.out.println("请输入数组长度:");
		int length = input.nextInt();
		System.out.println("请输入" + length + "个整数:");
		int[] nums = new int[length];
		for(int i = 0;i < nums.length;i++) {//录入数组的所有元素
			nums[i] = input.nextInt();
		}
		System.out.println("请输入要查找的整数:");
		int target = input.nextInt();	//录入目标数字
		int existence = 0;//用于判断是否已经找到匹配的两个数字
		for(int j = 0;j < nums.length-1;j++) {	//j和k分别表示两个数字的下标
			for(int k = j+1;k < nums.length;k++) {//k从j后起找,可以避免重复
				if( nums[k] + nums[j] == target ) {
					existence = 1;//每次都+1是不是有点多余?一次就够了呀
					System.out.println("目标数字是第"+(j+1)+","+(k+1)+"号数字之和");
					//break;//考虑到可能有相同的数字,用break只能输出第一个
					continue;//用continue可以把他们的下标都输出给用户
				}
			}
		}
		if(existence == 0) {
			System.out.println("目标数字不属于数组中任意两数之和");
		}
	}

}

运行结果

在这里插入图片描述

4、排序并查找

问题描述

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

代码

package collection_Task4;

public class Test7_4 {

	public static void main(String[] args) {
		/*********************排序并查找*********************/
		int[] nums = {1,3,9,5,6,7,15,4,8};
		//给定数组,开始排序
//		int max = nums[0];		//设定最大值指针
//		三角阵排序才需要最大值指针,冒泡法用j :j+1就可以了
		int contain = nums[0];	//数据交换的容器
		for(int i = 0;i < nums.length-1;i++) {//n个数→找出n-1个局部最大
			for(int j = 0;j < nums.length-1;j++) {
				if( nums[j] > nums[j+1] ) {
					contain = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = contain;//把大的数往后挪
				}
			}
		}
		//排序完毕,原数组变为[1,3,4,5,6,7,8,9,15],开始查找
		int target = 6;				//给定目标
		int answer = 0;				//判断是否找到
		int max = nums.length-1;	//初始化最大下标
		int min = 0;					//初始化最小下标
		int center = (max+min)/2;	//初始化中间下标
		while(true) {
			if( target == nums[center] ) {
				answer = 1;
				System.out.println( target + "在第" + (center+1) + "号位置");
				break;//顺利找到,退出
			}else if(target > nums[center]){//大了往右找
				min = center+1;
			}else if( target < nums[center] ){//小了往左找
				max = center-1;
			}
			if(min>max) break;//已经找到尽头,退出
			else center = (max+min)/2;//找完以后重新定标(歪嘴:这else,不写也罢)
		}
		if(answer == 0) System.out.println(target + "不在数组中");
	}

}

运行结果

在这里插入图片描述

5、

问题描述

给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入:[0,1,0,3,12]
输出:[1,3,12,0,0]

代码

package collection_Task4;

import java.util.Scanner;

public class Test7_5 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		/*********************移动零*********************/
		System.out.println("请输入数组长度:");
		int length = input.nextInt();
		System.out.println("请输入" + length + "个整数:");
		int[] nums = new int[length];
		for(int i = 0;i < nums.length;i++) {	//录入数组的所有元素
			nums[i] = input.nextInt();
		}
		System.out.println("------轰隆轰隆轰隆------");
		//第一步:暴力排序,不管三七二十一先排了再说
		int contain = nums[0];	//数据交换的容器
		for(int i = 0;i < nums.length-1;i++) {//n个数→找出n-1个局部最大
			for(int j = 0;j < nums.length-1;j++) {
				if( nums[j] > nums[j+1] ) {
					contain = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = contain;//把大的数往后挪
				}
			}
		}
		System.out.println("------排序已经完成------");
//		System.out.println("-------开始移动零-------");
		int countZero = 0;//让我看看这里有多少0
		for(int i = 0;i < nums.length;i++) {
			if( nums[i] == 0 ) countZero++;//抓到一只!
		}
		//最小的都是0,就从不是0的第一个开始挨个搬到前面就好咯
		for(int i = countZero;i < nums.length;i++) {
			nums[i-countZero] = nums[i];//有多少个0,后面的数就往前挪多少个窝
			nums[i] = 0;//原先的位置填上0
		}
		System.out.print("请您翻牌:");
		for(int i = 0;i < nums.length;i++) {	//输出数组的所有元素
			System.out.print(nums[i] + " ");
		}
		
	}

}

运行结果

在这里插入图片描述
打完收工(甜美围笑)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值