package day4;
import java.util.Arrays;
import java.util.Scanner;
public class Homework10101007 {
/**
* 1、查找某个整数
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输
入一个整数,查找此整数,找到输出下标, 没找到给出提示。
2、找出数组的最值
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组
的最大值、最小值。
3、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为
目标值的那两个整数,并输出他们的数组下标
假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出 0,1
4、排序并查找
对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并
输出排序后的下标。
5、移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保
持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
*/
public static void main(String[] args) {
//1、查找某个整数
findIntNum();
//2、找到数组的最值
findMaxMin();
//3、两数之和
System.out.println("两数之和:");
int[] nums = new int[] {2, 7, 11, 15};
int target = 9;
System.out.println(Arrays.toString(twoSum(nums, target)));
//4、排序并查找
System.out.println("对特定数组的排序后查找到序号为:"+sortFindIndex());
//5、移动零
int[] nums2 = new int[]{0,1,0,3,12};
System.out.println("移动零前的数组"+Arrays.toString(nums2));
moveZeroes(nums2);
System.out.println("移动零并排序后的数组"+Arrays.toString(nums2));
}
/**
* 冒泡排序,升序
*/
public static void sort(int[] nums) {
//排序
for(int i = 0; i < nums.length - 1; i++) {
for(int j = 0; j < nums.length - 1 - i; j++) {
if(nums[j] > nums[j + 1]) {
int tmp = nums[j];
nums[j] = nums[j+1];
nums[j + 1] = tmp;
}
}
}
}
/**
* 二分查找
* 返回值:未找到返回-1,找到返回对应数组中的序号
*/
public static int midSearch(int[] nums, int searchNum) {
int minIndex = 0;
int maxIndex = nums.length - 1;
int centerIndex = (minIndex + maxIndex)/2;
int i = 1;
while(true) {
if(nums[centerIndex] > searchNum) {
maxIndex = centerIndex - 1;
} else if(nums[centerIndex] < searchNum) {
minIndex = centerIndex + 1;
} else {
break;
}
if(minIndex > maxIndex) {
centerIndex = -1;
break;
}
centerIndex = (minIndex+maxIndex)/2;
i++;
}
return centerIndex;
}
/**
* 1、查找某个整数
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输
入一个整数,查找此整数,找到输出下标, 没找到给出提示。
*/
public static void findIntNum() {
int[] nums = new int[10];
Scanner scanner = new Scanner(System.in);
System.out.println("请连续输入10个数用于查找:");
for(int i = 0; i < 10; i++) {
nums[i] = scanner.nextInt();
}
sort(nums);
System.out.println("请输入要在数组nums中查找的数据:");
int searchNum = scanner.nextInt();
int res = midSearch(nums, searchNum);
if(res == -1) {
System.out.println("未找到要搜索的值");
return ;
}
System.out.println("要搜索的数据在数组中的位置:"+res);
}
/**
*2、找出数组的最值
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组
的最大值、最小值。
*/
public static void findMaxMin() {
int[] nums = new int[10];
Scanner scanner = new Scanner(System.in);
System.out.println("请连续输入10个整数组成数组:");
for(int i = 0; i < 10; i++) {
nums[i] = scanner.nextInt();
}
int max = nums[0],min = nums[0];
for(int i = 0; i < nums.length; i++) {
if(max < nums[i]) {
max = nums[i];
}
if(min > nums[i]) {
min = nums[i];
}
}
System.out.println("数组最大值:"+max+",最小值:"+min);
}
/**
* 3、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为
目标值的那两个整数,并输出他们的数组下标
假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出 0,1
*/
public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] {i, j};
}
}
}
return new int[]{0,0};
}
/**
* 4、排序并查找
对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并
输出排序后的下标。
*/
public static int sortFindIndex() {
int[] nums = new int[]{1, 3, 9, 5, 6, 7, 15, 4, 8};
sort(nums);
return midSearch(nums, 6);
}
/**
* 5、移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保
持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
*/
public static void moveZeroes(int[] nums) {
int curIndex = nums.length - 1;
int lastIndex = nums.length - 1;
int count = 0;
while(curIndex >= 0) {
if (nums[curIndex] == 0) {
count = lastIndex - curIndex;
for (int i = 0; i < count; i++) {
nums[curIndex + i] = nums[curIndex + i + 1];
}
nums[lastIndex] = 0;
lastIndex--;
}
curIndex--;
}
}
}