使用Java语言实现二分查找

欠下的,迟早是要还的


写 blog 的目的,不仅仅是记录,也不仅仅是分享,但是一定不要坑自己,这不昨晚装逼失败,翻车了,赶上这个金三银四,不知道大家有没有上车/上岸啊。。。


博主好久好久以前啊,写了一篇 blog 专坑自己的,而且啊 评论区 也有好心人提醒啊,可是博主由于某些原因啊,并没有及时更新,所以说今天这个局面,惨不忍睹。


事情的经过是昨晚:对面字节某佬闲聊不是,就聊到了 blog 上,说那好你把你 blog 地址发下,于是乎 大佬 直接 从我这个 blog 出了一道题,直接说你 blog 里面有,沃尼玛,我都记不清哪一篇了,时间太久了,他竟然能找到,针不愧是大佬啊,吐槽归吐槽,咱也不怂,不是说菜就害怕,没什么可怕的,写不出来嘛就写不出来,咱也不是啥都会,得认清看清自己不是,今天这个上午啊,我就翻箱倒柜,终于让我给找到了,竟然真的有一篇,专坑 粉丝 (主要是坑自己),踏马的栽在自己手里了,好比刘姥姥进大观园,我还是头一回。


山不转水转,及时查漏补缺,亡羊补牢,为时未晚。

其实都懂,形式主义,尼玛的外包都干的啥活,谁都心如明镜似的,但是流程还是要走的。

大数据开发工程师笔试题

老子也不是吓大的,稳如老狗,写不出来就如实说呗,我又不是干 Java 开发的。

不过话又说回来,这说明博主内功不深厚啊,有漏洞啊,bug 出在了自己身上,俗话说"打铁还需自身硬"


赶紧补上吧,好在现在有 AI ,这太方便

如果你要是问我为什么 面试的时候没用 AI,这 有这个必要么,而且对面也不是傻子,笔记本视频+屏幕共享,主要是这也是考察你,咱们做 码农这一行,面试如考试,珍惜每一次机会,最好是真实发挥自己的水平,即便你能手写出来,也不能说明你的项目能力,你的真实水平,只是片面的第一印象,仅此而已。

我们复盘总结,可以使用 AI

不是给 千问打广告,而是最近在用,确实写代码也还可以,那就试试

有一说一,看到没,人家都知道 AB 两种策略,迭代法和递归法。

那么如果你只是写个暴力解法,对面老六肯定会问你还有没有别的解法,如果你回答了其中一种,必然还会再问你还有没有其他解法。

当然了,你们如果有更好的解法,欢迎评论区留言,或者留下你们的 URL,我必然会 review,立下这个 flag 了,我说的。

好,直接上代码(注释也很齐全,一看就懂啊)

复制代码
public class BinarySearch {

    /**
     * 方法一:迭代法实现二分查找
     *
     * @param arr    已排序的整数数组(升序)
     * @param target 要查找的目标值
     * @return 目标值的索引,如果未找到则返回 -1
     */
    public static int binarySearchIterative(int[] arr, int target) {
        if (arr == null || arr.length == 0) {
            return -1;
        }

        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            // 防止 (left + right) 可能导致的整数溢出,推荐使用这种写法
            int mid = left + (right - left) / 2;

            if (arr[mid] == target) {
                return mid; // 找到目标,返回索引
            } else if (arr[mid] < target) {
                left = mid + 1; // 目标在右半部分
            } else {
                right = mid - 1; // 目标在左半部分
            }
        }

        return -1; // 未找到
    }

    /**
     * 方法二:递归法实现二分查找
     *
     * @param arr    已排序的整数数组
     * @param target 要查找的目标值
     * @return 目标值的索引,如果未找到则返回 -1
     */
    public static int binarySearchRecursive(int[] arr, int target) {
        if (arr == null || arr.length == 0) {
            return -1;
        }
        return searchHelper(arr, target, 0, arr.length - 1);
    }

    private static int searchHelper(int[] arr, int target, int left, int right) {
        if (left > right) {
            return -1; // 递归终止条件:范围为空
        }

        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            return searchHelper(arr, target, mid + 1, right);
        } else {
            return searchHelper(arr, target, left, mid - 1);
        }
    }

    // 测试主函数
    public static void main(String[] args) {
        int[] sortedArray = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
        int target = 7;
        int targetNotFound = 8;

        // 测试迭代法
        int indexIterative = binarySearchIterative(sortedArray, target);
        System.out.println("迭代法 - 查找 " + target + ": 索引为 " + indexIterative);

        int indexNotFoundIterative = binarySearchIterative(sortedArray, targetNotFound);
        System.out.println("迭代法 - 查找 " + targetNotFound + ": 索引为 " + indexNotFoundIterative);

        // 测试递归法
        int indexRecursive = binarySearchRecursive(sortedArray, target);
        System.out.println("递归法 - 查找 " + target + ": 索引为 " + indexRecursive);
        
        // 边界测试:查找第一个和最后一个元素
        System.out.println("查找第一个元素 (1): " + binarySearchIterative(sortedArray, 1));
        System.out.println("查找最后一个元素 (19): " + binarySearchIterative(sortedArray, 19));
    }
}

这还有分析


总之,不要坑自己,写 blog 的目的,是为了知识树技术栈积累,也是为了分享帮助他人,这是我写 blog 的一个初衷吧。

我也不知道能坚持到何时,但是有时间我就会更新。

有些经验就没分享,以后我会补上。


好了,我们下期见咯,拜拜!

相关推荐
2501_924952691 小时前
C++中的枚举类高级用法
开发语言·c++·算法
常利兵1 小时前
Android 开发探秘:View.post()为何能获取View宽高
java·数据库·sql
毕设源码-郭学长1 小时前
【开题答辩全过程】以 基于Spring Boot“活力青春”健身房管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
2401_873204651 小时前
代码覆盖率工具实战
开发语言·c++·算法
m0_475064501 小时前
Spring AI RAG简易demo
java·人工智能·spring
xht08321 小时前
PHP vs C++:编程语言终极对决
java·开发语言
少司府2 小时前
C++基础入门:第一个C++程序
java·c语言·开发语言·c++·ide
不染尘.2 小时前
欧拉路径算法
开发语言·数据结构·c++·算法·图论
液态不合群2 小时前
一文学习 Spring 声明式事务源码全流程总结
java·学习·spring