A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这个题我默认的数组是有序的,其实是没有关系的,即使是没有序可以排序(冒泡和选择我之前写过的)。

这个题的主要思想是:拿哪个要插入的数通过二分查找数组中比较,返回需要插入的位置i(这里的位置需要仔细的分析一下,Arrarys.BianarySerach()这个函数,如果没有匹配的它的返回值是一个负值),然后可以重新建立一个数组,长度比原数组大1,
遍历新数组,给新数组赋值,原数组小于位置i的直接赋值给新数组,到了i把需要插入的书赋值给新数组位置i,然后把原数组后面的部分赋值给新数组(这里新数组的位置比原数组大1).




import java.util.Arrays;
/*
* 面试题:
* 往一个有序的数组中插入一个数字
*/
public class ArrayDemo2 {
        public static void main(String[] args) {
                int[] arr={13,15,19,28,33,45,78,106};
                int[] arr1=new int[9];
                int a=11;
                int index=halfSearch_2(arr,a);
                System.out.println(index);
                int index1=Arrays.binarySearch(arr, a);
                int i=-(index+1);
                for (int j = 0; j < arr1.length; j++) {
                        if (i==j) {
                                arr1[j]=a;
                        }else if (j<i) {
                                arr1[j]=arr[j];
                        }else {
                                arr1[j]=arr[j-1];
                        }
                }
                for (int j = 0; j < arr1.length; j++) {
                        System.out.println(arr1[j]);
                }
               
           
        }
        public static int halfSearch_2(int[] arr, int key) {
                int max,min,mid;
                min=0;
                max=arr.length-1;
                while(min<=max){
                        mid=(min+max)/2;
                if (key>arr[mid]) {
                        min=mid+1;
                }else if (key<arr[mid]) {
                        max=mid-1;
                }else {
                        return mid;
                }       
                }       
                return -(min+1);
        }
}

改进版:中间用到了Arrays的sort(),bianarySearch()方法和System的arrayCopy()方法。
      并且是数组长度和元素自己定义,所以顺序要自己排。
import java.util.Arrays;
import java.util.Scanner;
/*
*
* 面试题:
* 往一个有序的数组中插入一个数字(之改进版)
*
*/
public class ArrayDemo {
        public static void main(String[] args) {
                Scanner scanner=new Scanner(System.in);
                //定义数组的长度
                System.out.print("请输入要输入的数组个数,n=");
                int n=scanner.nextInt();
                int arr[]=new int[n];
                //定义数组并为数组赋值
                System.out.print("请输入数组中的"+n+"个元素:");
                for (int i = 0; i < arr.length; i++) {
                        arr[i]=scanner.nextInt();
                }
                System.out.print("请输入要插入的数:");
                int num=scanner.nextInt();       
                Arrays.sort(arr);       
                //获取插入元素在原数组中的位置
                int i= -(Arrays.binarySearch(arr, num)+1);       
                //复制数组并插入要插入的元素
                int[] newArray=copyArray(arr,num, i, n);
                //打印数组
                print(newArray);
               
        }
                 public static int[] copyArray(int[]arr,int num,int i,int n) {
                          int[] newArray=new int[n+1];       
                              for (int j = 0; j < newArray.length; j++) {
                                      if (i==j) {
                                              newArray[j]=num;                       
                               }else if (j<i) {
                                              System.arraycopy(arr, 0, newArray, 0, i);
                                      }else {
                                              System.arraycopy(arr,j-1, newArray,j,1);
                                      }
                              }
                             return newArray;
                 }
                        public static void print(int[] arr){
                          System.out.print("[");
                          for (int j = 0; j < arr.length; j++) {
                                  if (j==arr.length-1) {
                                                System.out.print(arr[j]+"]");
                                        }else {
                                                System.out.print(arr[j]+",");
                                        }                             
                              }
                  }
}

15 个回复

倒序浏览
虽然看不懂.
回复 使用道具 举报
很好,很好!!!
回复 使用道具 举报
666666666666666
回复 使用道具 举报
都到数组了..
回复 使用道具 举报
先mark   在慢慢看...
回复 使用道具 举报
虽然我也看不懂....
回复 使用道具 举报
改进版的冒泡排序,没看懂怎么办,要不要讲解一下.
回复 使用道具 举报
虽然看不懂,但是我可以收藏啊.{:2_32:}
回复 使用道具 举报
不错,挺好的.
回复 使用道具 举报
嗯呢,不赖不赖!!!
回复 使用道具 举报

嗯,学到后面就都会了的,我现在主要是。。。你懂的
回复 使用道具 举报
看不懂 --------
回复 使用道具 举报
heimatai6 来自手机 中级黑马 2015-9-7 21:59:52
14#
好像还没学到这,我说咋看不懂呢
回复 使用道具 举报
然后呢8908 发表于 2015-9-7 21:28
嗯,学到后面就都会了的,我现在主要是。。。你懂的

懂,必须懂
回复 使用道具 举报
然后呢8908 发表于 2015-9-7 21:28
嗯,学到后面就都会了的,我现在主要是。。。你懂的

HMB.共同的追求
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马