package demo5;
/*
* 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]
*/
import java.util.Arrays;
import java.util.Scanner;
public class Demo1 {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
// findNum();
//findMaxAndMin();
//sumOfTwo();
//sorAndFind(6);
moveZore();
}
/**
* 移动零:将数组中非零数移入新数组,新数组剩下空间为0
*/
private static void moveZore() {
int[] arr={0,1,0,3,12};
int[] arr1=new int[arr.length];//未初始化数组元素默认是0
int index=0;
System.out.println("移动前数组:"+Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
if (arr[i]!=0) arr1[index++]=arr[i];
}
System.out.println("移动后数组:"+Arrays.toString(arr1));
}
/**
*排序并查找
*/
private static void sorAndFind(int num) {
int[] arr={1,3,9,5,6,7,15,4,8};
System.out.println("排序前数组:");
System.out.println(Arrays.toString(arr));//Arrays数组工具类toString将数组换成字符串
arr=bubbleSort(arr);
System.out.println("冒泡排序后数组:");
System.out.println(Arrays.toString(arr));
halfFind(arr, num);
}
/**
* 二分查找
* @param arr
* @param num
*/
private static void halfFind(int[] arr, int num) {
int minIndex=0;
int maxIndex=arr.length-1;
int midIndex=(minIndex+maxIndex)/2;
while(minIndex<maxIndex){
if (num<arr[midIndex]) maxIndex=midIndex-1;
if (num>arr[midIndex]) minIndex=midIndex+1;
if (num==arr[midIndex]) {
System.out.println("二分查找目标"+num+"的下标是"+midIndex);
break;
}
midIndex=(minIndex+maxIndex)/2;
}
if (minIndex>=maxIndex){
System.out.println("目标不存在");
}
}
/**
* 冒泡排序
* @param arr
* @return
*/
private static int[] bubbleSort(int[] arr) {
int temp;
for (int i=0;i<arr.length-1;i++){
for (int j=0;j<arr.length-1-i;j++){
if (arr[j+1]<arr[j]){
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
/**
* 两数之和为目标数target,给定数组和target
*/
private static void sumOfTwo() {
int[] nums={2,7,11,15};
int target=9;
int i,j;
System.out.println("给定数组nums:"+Arrays.toString(nums));
System.out.println("给定target: "+target);
finish:for ( i=0;i<nums.length/2;i++){
for ( j=i+1;j<nums.length;j++){
if (nums[i]+nums[j]==target) {
System.out.println(i+" "+j);
break finish;
}
}
}
if (i==nums.length/2){
System.out.println("没有找到两数之和等于target值");
}
}
/**
* 寻找最值
*/
private static void findMaxAndMin() {
int[] nums = initArray();
int max=nums[0];
int min=nums[0];
for (int i = 0; i < nums.length; i++) {
if (nums[i]>max) max=nums[i];
if (nums[i]<min) min=nums[i];
}
System.out.println("数组最大值:"+max+",数组最小值:"+min);
}
/**
* 查找某个整数
*/
private static void findNum() {
int[] nums = initArray();
System.out.println("输入一个整数:");
int a = sc.nextInt();
for (int i = 0; i < nums.length; i++) {
if (nums[i]==a){
System.out.println("该整数所在数组下表是:"+i);
break;
}
if (i==nums.length-1){
System.out.println("数组中不存在该整数");
}
}
}
/**
* 初始化数组
* @return
*/
private static int[] initArray() {
int[] nums=new int[10];
System.out.println("输入10个整数:");
for (int i = 0; i < nums.length; i++) {
nums[i]=sc.nextInt();
}
return nums;
}
}