文章目录
看前须知
思路基本已经写在注释里了,有更多的想法会趁空闲的时候来尝试的,希望队友们也分享下自己的思路
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] + " ");
}
}
}
运行结果
打完收工(甜美围笑)