找到有重复元素的有序数组的某个值第一次出现的位置
public static void main(String[] args) {
// 排好序的数组,有重复元素
int[] nums = { 1, 6, 6, 6, 78, 78, 78, 1000 };
Test2 test2 = new Test2();
int a = test2.getVal(nums, 78);
System.out.println("该数所在数组索引为" + a);
if (a != -1) {
if (a > 0 && nums[a - 1] == nums[a]) {
while (a - 1 >= 0 && nums[a - 1] == nums[a]) {
a--;
}
System.out.println("该数所在数组第一个索引为" + a);
} else {
System.out.println("该数所在数组第一个索引为" + a);
}
}
}
private int getVal(int[] nums, int value) {
// 声明中间值
int middle = 0;
// 声明开始值
int start = 0;
// 声明结束值
int end = nums.length;
// 用for循环是知道循环的次数,此处用while是因为不知道能循环多少次,且算法中开始值只能小于结束值
while (start < end) {
// 每次循环重新定义中间值
middle = (start + end) / 2;
// 当中间元素等于查找的元素,输出中间元素的索引,返回
if (value == nums[middle]) {
return middle;
} else if (value > nums[middle]) {
// 如果中间元素小于查找值,开始值加一
start = middle + 1;
} else if (value < nums[middle]) {
// 若果中间元素大于查找值,结束值减一
end = middle - 1;
}
}
// 在上述的循环中没有找到值,则证明不存在
System.out.println("没该数");
return -1;
}