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)); //3
System.out.println(E53FindInNumbersInOrder.getTimes(numbers1, 7, 1)); //3
System.out.println(E53FindInNumbersInOrder.getTimes(numbers1, 7, 5)); //5
/*缺失的数字*/
int[] numbers2 = {0, 1, 2, 3, 4, 5, 7, 8 , 9};
System.out.println(E53FindInNumbersInOrder.getLostNumber(numbers2, 9)); //6
/*数组索引与数值相同的数字*/
int[] numbers3 = {-3, -1, 1, 3, 5};
System.out.println(E53FindInNumbersInOrder.getNumberEqualToIndex(numbers3, 5)); //3
}
}
在排序数组中查找数字(Java实现)
最新推荐文章于 2022-02-07 23:10:45 发布