问题一(可改变数组)
public class Duplicate1 {
public static int getDuplicateNumber ( int [ ] numbers, int length) {
if ( numbers == null || length <= 0 ) {
return - 1 ;
}
for ( int number : numbers) {
if ( number < 0 || number>= length) {
return - 1 ;
}
}
for ( int i = 0 ; i < length; i++ ) {
while ( numbers[ i] != i) {
if ( numbers[ i] == numbers[ numbers[ i] ] ) {
return numbers[ i] ;
}
else {
int t = numbers[ i] ;
numbers[ i] = numbers[ t] ;
numbers[ t] = t;
}
}
}
return - 1 ;
}
public static void main ( String[ ] args) {
int [ ] numbers1 = { 1 , 2 , 3 , 4 , 5 , 0 } ;
int [ ] numbers2 = { 1 , 2 , 3 , 2 , 5 , 0 } ;
int [ ] numbers3 = { 1 , 2 , 3 , 2 , 5 , 5 } ;
int [ ] numbers4 = { } ;
int [ ] numbers5 = null;
int [ ] numbers6 = { 1 , 2 , 3 , 2 , 7 , 5 } ;
System. out. println ( "numbers1中的重复数字:" + Duplicate1. getDuplicateNumber ( numbers1, 6 ) ) ;
System. out. println ( "numbers2中的重复数字:" + Duplicate1. getDuplicateNumber ( numbers2, 6 ) ) ;
System. out. println ( "numbers3中的重复数字:" + Duplicate1. getDuplicateNumber ( numbers3, 6 ) ) ;
System. out. println ( "numbers4中的重复数字:" + Duplicate1. getDuplicateNumber ( numbers4, 0 ) ) ;
System. out. println ( "numbers5中的重复数字:" + Duplicate1. getDuplicateNumber ( numbers5, 0 ) ) ;
System. out. println ( "numbers6中的重复数字:" + Duplicate1. getDuplicateNumber ( numbers6, 6 ) ) ;
}
}
问题二(不可改变数组)
public class Duplicate2 {
public static int getDuplicateNumber ( int [ ] numbers, int length) {
if ( numbers == null || length <= 0 ) {
System. out. println ( "输入不合法" ) ;
return - 1 ;
}
for ( int number : numbers) {
if ( number > numbers. length || number < 1 ) {
System. out. println ( "数组取值超出范围" ) ;
return - 1 ;
}
}
int lo = 1 ;
int hi = numbers. length - 1 ;
while ( hi >= lo) {
int mid = ( lo + hi) / 2 ;
int count = countRange ( numbers, lo, mid) ;
if ( lo == hi) {
if ( count > 1 ) {
System. out. println ( "重复的数字有:" + lo) ;
return lo;
}
break ;
}
if ( count > mid - lo + 1 ) {
hi = mid;
}
else {
lo = mid + 1 ;
}
}
return - 1 ;
}
private static int countRange ( int [ ] numbers, int a, int b) {
int count = 0 ;
for ( int number : numbers) {
if ( number >= a && number <= b)
count++ ;
}
return count;
}
public static void main ( String[ ] args) {
int [ ] numbers1 = { 1 , 3 , 3 , 4 , 5 , 2 } ;
int [ ] numbers2 = { 1 , 2 , 3 , 2 , 5 , 5 } ;
int [ ] numbers3 = { } ;
int [ ] numbers4 = null;
int [ ] numbers5 = { 1 , 2 , 3 , 2 , 7 , 5 } ;
System. out. println ( "numbers1中存在的重复数字:" + Duplicate2. getDuplicateNumber ( numbers1, 6 ) ) ;
System. out. println ( "numbers2中存在的重复数字:" + Duplicate2. getDuplicateNumber ( numbers2, 6 ) ) ;
System. out. println ( "numbers3中存在的重复数字:" + Duplicate2. getDuplicateNumber ( numbers3, 0 ) ) ;
System. out. println ( "numbers4中存在的重复数字:" + Duplicate2. getDuplicateNumber ( numbers4, 0 ) ) ;
System. out. println ( "numbers5中存在的重复数字:" + Duplicate2. getDuplicateNumber ( numbers5, 6 ) ) ;
}
}