【Java相关练习】二分查找的常见笔试题

二分查找的常见笔试题

题目描述

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){
   
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值