public class E53FindInNumbersInOrder {
public static int getTimes(int[] numbers, int length, int target) {
int times = -1;
if (numbers != null && length > 0) {
int start = getStartIndex(numbers, length, target);
int end = getEndIndex(numbers, length, target);
if (start > -1 && end > -1)
times = end - start + 1;
}
return times;
}
private static int getEndIndex(int[] numbers, int length, int target) {
int start = 0;
int end = length - 1;
while (start <= end) {
int middle = (start + end) >> 1;
if (numbers[middle] == target) {
if (middle == length - 1 || (middle < length - 1 && numbers[middle + 1] != target))
return middle;
else
start = middle + 1;
} else if (numbers[middle] < target)
start = middle + 1;
else
end = middle - 1;
}
return -1;
}
private static int getStartIndex(int[] numbers, int length, int target) {
int start = 0;
int end = length - 1;
while (start <= end) {
int middle = (start + end) >> 1;
if (numbers[middle] == target) {
if (middle == 0 || (numbers[middle - 1] != target))
return middle;
else
end = middle - 1;
}
else if (numbers[middle] > target)
end = middle - 1;
else
start = middle + 1;
}
return -1;
}
public static int getLostNumber(int[] numbers, int length){
if (numbers == null || length <= 0)
return -1;
int start = 0;
int end = length - 1;
while(start <= end){
int middle = (start + end) >> 1;
if (numbers[middle] != middle){
if (middle == 0 || numbers[middle - 1] == middle - 1)
return middle;
else
end = middle - 1;
}
else
start = middle + 1;
}
return -1;
}
public static int getNumberEqualToIndex(int[] numbers, int length){
if (numbers == null || length <= 0)
return -1;
int start = 0;
int end = length - 1;
while(start <= end){
int middle = (start + end) >> 1;
if (numbers[middle] == middle)
return middle;
else if (numbers[middle] > middle)
end = middle - 1;
else
start = middle + 1;
}
return -1;
}
public static void main(String[] args){
int[] numbers1 = {1, 2, 3, 3, 3, 4, 5};
System.out.println(E53FindInNumbersInOrder.getTimes(numbers1, 7, 3));
System.out.println(E53FindInNumbersInOrder.getTimes(numbers1, 7, 1));
System.out.println(E53FindInNumbersInOrder.getTimes(numbers1, 7, 5));
int[] numbers2 = {0, 1, 2, 3, 4, 5, 7, 8 , 9};
System.out.println(E53FindInNumbersInOrder.getLostNumber(numbers2, 9));
int[] numbers3 = {-3, -1, 1, 3, 5};
System.out.println(E53FindInNumbersInOrder.getNumberEqualToIndex(numbers3, 5));
}
}