思路
代码
数组类
public class MyArray {
private int [ ] elements;
public MyArray ( ) {
elements = new int [ 0 ] ;
}
public int size ( ) {
return elements. length;
}
public void add ( int element) {
int [ ] newArray = new int [ elements. length + 1 ] ;
for ( int i = 0 ; i < elements. length; i++ ) {
newArray[ i] = elements[ i] ;
}
newArray[ elements. length] = element;
elements = newArray;
}
public void show ( ) {
System. out. println ( Arrays. toString ( elements) ) ;
}
public void delete ( int index) {
if ( index < 0 || index > elements. length) {
throw new RuntimeException ( "数组下标越界" ) ;
}
int [ ] newArr = new int [ elements. length - 1 ] ;
for ( int i = 0 ; i < elements. length; i++ ) {
if ( i < index) {
newArr[ i] = elements[ i] ;
} else if ( i > index) {
newArr[ i - 1 ] = elements[ i] ;
}
}
elements = newArr;
}
public int get ( int index) {
return elements[ index] ;
}
public void insert ( int index, int element) {
int [ ] newArr = new int [ elements. length + 1 ] ;
for ( int i = 0 ; i < elements. length; i++ ) {
if ( i < index) {
newArr[ i] = elements[ i] ;
} else {
newArr[ i + 1 ] = elements[ i] ;
}
newArr[ index] = element;
}
elements = newArr;
}
public void set ( int index, int element) {
if ( index < 0 || index > elements. length) {
throw new RuntimeException ( "数组下标越界" ) ;
}
elements[ index] = element;
}
public int search ( int target) {
for ( int i = 0 ; i < elements. length; i++ ) {
if ( elements[ i] == target) {
return i;
}
}
return - 1 ;
}
public List< Integer> binarySearch2 ( MyArray myArray, int left, int right, int target) {
if ( left > right) {
return new ArrayList < Integer> ( ) ;
}
int mid = ( left + right) / 2 ;
int midVal = myArray. elements[ mid] ;
if ( target > midVal) {
left = mid + 1 ;
return binarySearch2 ( myArray, left, right, target) ;
}
else if ( target < midVal) {
right = mid - 1 ;
return binarySearch2 ( myArray, left, right, target) ;
}
else {
List< Integer> resIndexList = new ArrayList < > ( ) ;
int temp = mid - 1 ;
while ( true ) {
if ( temp < 0 || myArray. elements[ temp] != target) {
break ;
}
resIndexList. add ( temp) ;
temp -= 1 ;
}
resIndexList. add ( mid) ;
temp = mid + 1 ;
while ( true ) {
if ( temp > myArray. elements. length - 1 || myArray. elements[ temp] != target) {
break ;
}
resIndexList. add ( temp) ;
temp += 1 ;
}
return resIndexList;
}
}
}
测试
public class TestMyArray {
public static void main ( String[ ] args) {
MyArray myArray = new MyArray ( ) ;
int size = myArray. size ( ) ;
System. out. println ( size) ;
myArray. add ( 99 ) ;
myArray. add ( 98 ) ;
myArray. add ( 97 ) ;
System. out. println ( myArray. size ( ) ) ;
myArray. show ( ) ;
myArray. add ( 100 ) ;
myArray. show ( ) ;
myArray. delete ( 3 ) ;
myArray. show ( ) ;
myArray. insert ( 2 , 100 ) ;
myArray. show ( ) ;
myArray. set ( 3 , 101 ) ;
myArray. show ( ) ;
MyArray myArrayNew = new MyArray ( ) ;
myArrayNew. add ( 1 ) ;
myArrayNew. add ( 8 ) ;
myArrayNew. add ( 10 ) ;
myArrayNew. add ( 89 ) ;
myArrayNew. add ( 89 ) ;
myArrayNew. add ( 99 ) ;
myArrayNew. add ( 99 ) ;
myArrayNew. add ( 1000 ) ;
myArrayNew. add ( 1000 ) ;
myArrayNew. add ( 1234 ) ;
List< Integer> resultIndexList = myArray. binarySearch3 ( myArrayNew, 0 , myArrayNew. size ( ) , 99 ) ;
System. out. print ( "找到的符合target的索引为: " ) ;
for ( int i = 0 ; i < resultIndexList. size ( ) ; i++ ) {
System. out. printf ( "%s\t" , resultIndexList. get ( i) ) ;
}
}
打印结果