二分查找的常见笔试题
题目描述
1、给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
代码实现
class FirstQuestion{
/**
* 1、给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
* 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
*/
static class IndexNode{
private int index;
private boolean flag;
public IndexNode(int index,boolean flag){
this.index = index;
this.flag = flag;
}
}
public static IndexNode getIndex(int[] arr,int value){
int left = 0,right = arr.length;
IndexNode indexNode = new IndexNode(-1,false);
while (left <= right){
int mid = (right - left) / 2 + left;
if(value > arr[mid]){
left = mid + 1;
}else if(value < arr[mid]){
right = mid - 1;
}else {
indexNode.index = mid;
indexNode.flag = true;
break;
}
}
if(indexNode.index == -1){
indexNode.index = left; //TODO:它将会被按顺序插入的位置一定等于左下标
}
return indexNode;
}
}
题目描述
2、贪吃的小明。小明的父母要出差N天,走之前给小明留下了M块奶糖,小明决定每天吃的奶糖数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有奶糖吃,请问他第一天最多能吃多少块奶糖。例如: input: 出差 4天 , 7块奶糖 // 1 2 4;output : 4
代码实现
- 方法一
private static int getJudge_ForSecond(int mid,int day){
int sum = 0;
for(int i = 1;i < day;i++){
sum += mid;
mid = (mid + 1) / 2;
}
return sum;
}
public static int getMaxCount_Second(int day,int num){
if(day == 1){
return num;
}
int left = 1,right = num;
while (left <= right){
int mid = (right - left) / 2 + left;
int sum = getJudge_ForSecond(mid,day);
if(sum < num){
left = mid + 1;
}else if(sum > num){