我给思路,你可以参考一楼的方法:
既然已经是升序排列了,假设数组长度为5,先拿插入的数字与数组最中间的比较,也就是第三个元素,如果小于,那么这个数字只能放到前半部分。也就是前三个,再拿它与前三个中间那个比较,也就是第二个元素,这样比较过后插入就行。
题目:给定一个有序的数组{13, 15, 19, 28, 33, 45, 78, 106},如果往该数组中存储一个元素,并保证这个数组还是有序的,那么这个元素的存储的角标如何获取?并打印出插入后的数组packagecom.ljy.interviewQuestion
/**
* 题目:给定一个有序的数组{13, 15, 19, 28, 33, 45, 78, 106},
* 如果往该数组中存储一个元素50,并保证这个数组还是有序的,
* 那么这个元素的存储的角标如何获取?
* 思路:利用二分查找法,将最后返回min值即可。
* 步骤: 1)定义arr,key来存储题目中的值,定义max,min和mid来分别记录二分区间
* 2)使用while循环结构来控制,循环条件为 min <= max,否则返回min
* @author liaojianya
* 2016-11-16
*/
publicclass InsertOrderedArr
{
publicstaticvoid main(String[] args)
{
int[] arr = newint[] {13, 15, 19, 28, 33, 45, 78, 106}
int key = 50
int index = getInsertIndex(arr, key)
System.out.println(key + "应该插入到数组的位置下标为: " + index)
int[] arr1 = newint[arr.length + 1]
insertArr(arr, arr1, key, index)
printArr(arr1)
}
//打印数组
privatestaticvoid printArr(int[] arr1)
{
System.out.print("插入元素后的数组为: [")
for(int i = 0 i < arr1.length i++)
{
if(i != arr1.length - 1)
{
System.out.print(arr1[i] + ", ")
}
else
{
System.out.println(arr1[i] + "]")
}
}
}
publicstaticint getInsertIndex(int[] arr, int key)
{
int min = 0
int max = arr.length - 1
while(min <= max)
{
//右移折半
int mid = (min + max) >> 1
//如果key值比中间值大,则所要插入位置在数组的右半边
if(key > arr[mid])
{
min = mid + 1
}
//如果key值比中间值小,则所要插入位置在数组的左半边
elseif(key < arr[mid])
{
max = mid - 1
}
//key值和中间值一样大,则直接返回index = mid
else
{
return mid
}
}
//如果下标min > max,则返回min位置即为所要插入的位置
return min
}
/*
* 步骤:
* 循环遍历arr,如果i < index,则arr1[i] = arr[i]
* 如果i == index,则arr1[i] = key
* 否则,arr1[i] = arr[i-1]
*
*/
publicstaticvoid insertArr(int[] arr, int[] arr1, int key, int index)
{
for(int i = 0 i < arr1.length i++)
{
if (i < index)
{
arr1[i] = arr[i]
}
elseif(i == index)
{
arr1[i] = key
}
else
{
arr1[i] = arr[i-1]
}
}
}
}
程序输出:
用不定长的数组直接初始化那些数组元素,上面我举例说明了一下,希望能够帮到楼主~望采纳~~~
public class ListInsert {
public static long[] insert(long[] arr,int i,long l){
//新建数组,对原数组扩容
long[] arr1 = new long[arr.length+1]
//将原数组数据赋值给新数组
for(int j = 0j<arr.lengthj++){
arr1[j] = arr[j]
}
//将大于i的数据向后移动一位
for(int j = arr1.length-2j>ij--){
arr1[j+1] = arr1[j]
}
//赋值到i位置
arr1[i+1] = l
return arr1
}
//测试
public static void main(String[] args){
long[] arr = {12,25,11,36,14}
long[] arr1 = insert(arr, 2, 100)
for (long l : arr1) {
System.out.print(l+" ")
}
}
数组的扩容方式:arr = Arrays.copyOf(arr, arr.length+1)
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)