Java工程师面试必备|算法Top30高频真题详解

40道JAVA经典算法面试题(答案) 所有的面试题目都不是一成不变的,特别是像一线大厂,上面的面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。大致内容包括了Java集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈!希望对于大家有所帮助。a的值,其中a是一个数字。... 阅读详情

1.说一下什么是二分法?使用二分法时需要注意什么?如何用代码实现?

二分法查找(Binary Search)也称折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。

二分法使用的时候需要注意:二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。

public class Lesson7_4 {
    public static void main(String[] args) {
        // 二分法查找
        int[] binaryNums = {1, 6, 15, 18, 27, 50};
        int findValue = 27;
        int binaryResult = binarySearch(binaryNums, 0, binaryNums.length - 1, findValue);
        System.out.println("元素第一次出现的位置(从0开始):" + binaryResult);
    }
    /**
     * 二分查找,返回该值第一次出现的位置(下标从 0 开始)
     * @param nums      查询数组
     * @param start     开始下标
     * @param end       结束下标
     * @param findValue 要查找的值
     * @return int
     */
    private static int binarySearch(int[] nums, int start, int end, int findValue) {
        if (start <= end) {
            // 中间位置
            int middle = (start + end) / 2;
            // 中间的值
            int middleValue = nums[middle];
            if (findValue == middleValue) {
                // 等于中值直接返回
                return middle;
            } else if (findValue < middleValue) {
                // 小于中值,在中值之前的数据中查找
                return binarySearch(nums, start, middle - 1, findValue);
            } else {
                // 大于中值,在中值之后的数据中查找
                return binarySearch(nums, middle + 1, end, findValue);
            }
        }
        return -1;
    }
}

执行结果如下:

元素第一次出现的位置(从0开始):4

2.什么是斐波那契数列?用代码如何实现?

斐波那契数列(Fibonacci Sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711…… 在数学上,斐波那契数列以如下被以递推的方法定义:

F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。

斐波那契数列之所以又称黄金分割数列,是因为随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887……

斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711……

斐波那契数列的特征:第三项开始(含第三项)它的值等于前两项之和。

斐波那契数列代码实现示例,如下所示:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 斐波那契数列
        int fibonacciIndex = 7;
        int fibonacciResult = fibonacci(fibonacciIndex);
        System.out.println("下标(从0开始)" + fibonacciIndex + "的值为:" + fibonacciResult);
    }
    /**
     * 斐波那契数列
     * @param index 斐波那契数列的下标(从0开始)
     * @return int
     */
    private static int fibonacci(int index) {
        if (index == 0 || index == 1) {
            return index;
        } else {
            return fibonacci(index - 1) + fibonacci(index - 2);
        }
    }
}

执行结果如下:

下标(从0开始)7的值为:13

3.一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?请使用代码实现。

先来分析一下,本题目

第一个月:有 1 对小兔子;

第二个月:小兔子变成大兔子;

第三个月:大兔子下了一对小兔子;

第四个月:大兔子又下了一对小兔子,上个月的一对小兔子变成了大兔子;

……

最后总结的规律如下列表所示:

可以看出,兔子每个月的总对数刚好符合斐波那契数列,第 12 个月的时候,总共有 144 对兔子。 实现代码如下:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 兔子的总对数
        int rabbitNumber = fibonacci(12);
        System.out.println("第 12 个月兔子的总对数是:" + rabbitNumber);
    }
    /**
     * 斐波那契数列
     * @param index 斐波那契数列的下标(从0开始)
     * @return int
     */
    private static int fibonacci(int index) {
        if (index == 0 || index == 1) {
            return index;
        } else {
            return fibonacci(index - 1) + fibonacci(index - 2);
        }
    }
}

执行结果如下:

第 12 个月兔子的总对数是:144

4.什么是冒泡排序?用代码如何实现?

冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基础的一个,它的实现思路是通过相邻数据的交换达到排序的目的。

冒泡排序的执行流程是:

对数组中相邻的数据,依次进行比较;

如果前面的数据大于后面的数据,则把前面的数据交换到后面。经过一轮比较之后,就能把数组中最大的数据排到数组的最后面了;

再用同样的方法,把剩下的数据逐个进行比较排序,最后得到就是从小到大排序好的数据。

冒泡排序算法代码实现,如下所示:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 冒泡排序调用
        int[] bubbleNums = {132, 110, 122, 90, 50};
        System.out.println("排序前:" + Arrays.toString(bubbleNums));
        bubbleSort(bubbleNums);
        System.out.println("排序后:" + Arrays.toString(bubbleNums));
    }
    /**
     * 冒泡排序
     */
    private static void bubbleSort(int[] nums) {
        int temp;
        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < nums.length - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
            System.out.print("第" + i + "次排序:");
            System.out.println(Arrays.toString(nums));
        }
    }
}

执行结果如下:

排序前:[132, 110, 122, 90, 50]

第1次排序:[110, 122, 90, 50, 132]

第2次排序:[110, 90, 50, 122, 132]

第3次排序:[90, 50, 110, 122, 132]

第4次排序:[50, 90, 110, 122, 132]

排序后:[50, 90, 110, 122, 132]

5.什么是选择排序?用代码如何实现?

选择排序(Selection Sort)算法也是比较简单的排序算法,其实现思路是每一轮循环找到最小的值,依次排到数组的最前面,这样就实现了数组的有序排列。

比如,下面是一组数据使用选择排序的执行流程:

初始化数据:18, 1, 6, 27, 15

第一次排序:1, 18, 6, 27, 15

第二次排序:1, 6, 18, 27, 15

第三次排序:1, 6, 15, 27, 18

第四次排序:1, 6, 15, 18, 27

选择排序算法代码实现,如下所示:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 选择排序调用
        int[] selectNums = {18, 1, 6, 27, 15};
        System.out.println("排序前:" + Arrays.toString(selectNums));
        selectSort(selectNums);
        System.out.println("排序后:" + Arrays.toString(selectNums));
    }
    /**
     * 选择排序
     */
    private static void selectSort(int[] nums) {
        int index;
        int temp;
        for (int i = 0; i < nums.length - 1; i++) {
            index = i;
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] < nums[index]) {
                    index = j;
                }
            }
            if (index != i) {
                temp = nums[i];
                nums[i] = nums[index];
                nums[index] = temp;
            }
            System.out.print("第" + i + "次排序:");
            System.out.println(Arrays.toString(nums));
        }
    }
}

执行结果如下:

排序前:[18, 1, 6, 27, 15]

第0次排序:[1, 18, 6, 27, 15]

第1次排序:[1, 6, 18, 27, 15]

第2次排序:[1, 6, 15, 27, 18]

第3次排序:[1, 6, 15, 18, 27]

排序后:[1, 6, 15, 18, 27]

6.什么是插入排序?用代码如何实现?

插入排序(Insertion Sort)算法是指依次把当前循环的元素,通过对比插入到合适位置的排序算法。 比如,下面是一组数据使用插入排序的执行流程:

初始化数据:18, 1, 6, 27, 15

第一次排序:1, 18, 6, 27, 15

第二次排序:1, 6, 18, 27, 15

第三次排序:1, 6, 18, 27, 15

第四次排序:1, 6, 15, 18, 27

插入排序算法代码实现,如下所示:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 插入排序调用
        int[] insertNums = {18, 1, 6, 27, 15};
        System.out.println("排序前:" + Arrays.toString(insertNums));
        insertSort(insertNums);
        System.out.println("排序后:" + Arrays.toString(insertNums));
    }
    /**
     * 插入排序
     */
    private static void insertSort(int[] nums) {
        int i, j, k;
        for (i = 1; i < nums.length; i++) {
            k = nums[i];
            j = i - 1;
            // 对 i 之前的数据,给当前元素找到合适的位置
            while (j >= 0 && k < nums[j]) {
                nums[j + 1] = nums[j];
                // j-- 继续往前寻找
                j--;
            }
            nums[j + 1] = k;
            System.out.print("第" + i + "次排序:");
            System.out.println(Arrays.toString(nums));
        }
    }
}

执行结果如下:

排序前:[18, 1, 6, 27, 15]

第1次排序:[1, 18, 6, 27, 15]

第2次排序:[1, 6, 18, 27, 15]

第3次排序:[1, 6, 18, 27, 15]

第4次排序:[1, 6, 15, 18, 27]

排序后:[1, 6, 15, 18, 27]

7.什么是快速排序?用代码如何实现?

快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序思想实现的,快速排序算法是对冒泡排序算法的改进,从而具有更高的执行效率。

快速排序是通过多次比较和交换来实现排序的执行流程如下:

首先设定一个分界值,通过该分界值把数组分为左右两个部分;

将大于等于分界值的元素放到分界值的右边,将小于分界值的元素放到分界值的左边;

然后对左右两边的数据进行独立的排序,在左边数据中取一个分界值,把小于分界值的元素放到分界值的左边,大于等于分界值的元素,放到数组的右边;右边的数据也执行同样的操作;

重复上述操作,当左右各数据排序完成后,整个数组也就完成了排序。

快速排序算法代码实现,如下所示:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 快速排序调用
        int[] quickNums = {18, 1, 6, 27, 15};
        System.out.println("排序前:" + Arrays.toString(quickNums));
        quickSort(quickNums, 0, quickNums.length - 1);
        System.out.println("排序后:" + Arrays.toString(quickNums));
    }
    /**
     * 快速排序
     */
    private static void quickSort(int[] nums, int left, int right) {
        int f, t;
        int ltemp = left;
        int rtemp = right;
        // 分界值
        f = nums[(left + right) / 2];
        while (ltemp < rtemp) {
            while (nums[ltemp] < f) {
                ++ltemp;
            }
            while (nums[rtemp] > f) {
                --rtemp;
            }
            if (ltemp <= rtemp) {
                t = nums[ltemp];
                nums[ltemp] = nums[rtemp];
                nums[rtemp] = t;
                --rtemp;
                ++ltemp;
            }
        }
        if (ltemp == rtemp) {
            ltemp++;
        }
        if (left < rtemp) {
            // 递归调用
            quickSort(nums, left, ltemp - 1);
        }
        if (right > ltemp) {
            // 递归调用
            quickSort(nums, rtemp + 1, right);
        }
    }
}

执行结果如下:

排序前:[18, 1, 6, 27, 15]

排序后:[1, 6, 15, 18, 27]

8.什么是堆排序?用代码如何实现?

堆排序(Heap Sort)算法是利用堆结构和二叉树的一些特性来完成排序的。 堆结构是一种树结构,准确来说是一个完全二叉树。完全二叉树每个节点应满足以下条件:

如果按照从小到大的顺序排序,要求非叶节点的数据要大于等于,其左、右子节点的数据;

如果按照从大到小的顺序排序,要求非叶节点的数据小于等于,其左、右子节点的数据。

可以看出,堆结构对左、右子节点的大小没有要求,只规定叶节点要和子节点(左、右)的数据满足大小关系。

比如,下面是一组数据使用堆排序的执行流程:

堆排序算法代码实现,如下所示:

public class Lesson7_4 {
    public static void main(String[] args) {
        // 堆排序调用
        int[] heapNums = {18, 1, 6, 27, 15};
        System.out.println("堆排序前:" + Arrays.toString(heapNums));
        heapSort(heapNums, heapNums.length);
        System.out.println("堆排序后:" + Arrays.toString(heapNums));
    }
    /**
     * 堆排序
     * @param nums 待排序数组
     * @param n    堆大小
     */
    private static void heapSort(int[] nums, int n) {
        int i, j, k, temp;
        // 将 nums[0,n-1] 建成大根堆
        for (i = n / 2 - 1; i >= 0; i--) {
            // 第 i 个节点,有右子树
            while (2 * i + 1 < n) {
                j = 2 * i + 1;
                if ((j + 1) < n) {
                    // 右左子树小于右子树,则需要比较右子树
                    if (nums[j] < nums[j + 1]) {
                        // 序号增加 1,指向右子树
                        j++;
                    }
                }
                if (nums[i] < nums[j]) {
                    // 交换数据
                    temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                    // 堆被破坏,重新调整
                    i = j;
                } else {
                    // 左右子节点均大,则堆未被破坏,不需要调整
                    break;
                }
            }
        }
        for (i = n - 1; i > 0; i--) {
            // 与第 i 个记录交换
            temp = nums[0];
            nums[0] = nums[i];
            nums[i] = temp;
            k = 0;
            // 第 i 个节点有右子树
            while (2 * k + 1 < i) {
                j = 2 * k + 1;
                if ((j + 1) < i) {
                    // 右左子树小于右子树,则需要比较右子树
                    if (nums[j] < nums[j + 1]) {
                        // 序号增加 1,指向右子树
                        j++;
                    }
                }
                if (nums[k] < nums[j]) {
                    // 交换数据
                    temp = nums[k];
                    nums[k] = nums[j];
                    nums[j] = temp;
                    // 堆被破坏,重新调整
                    k = j;
                } else {
                    // 左右子节点均大,则堆未被破坏,不需要调整
                    break;
                }
            }
            // 输出每步排序结果
            System.out.print("第" + (n - i) + "次排序:");
            System.out.println(Arrays.toString(nums));
        }
    }
}

执行结果如下:

堆排序前:[18, 1, 6, 27, 15]

第1次排序:[18, 15, 6, 1, 27]

第2次排序:[15, 1, 6, 18, 27]

第3次排序:[6, 1, 15, 18, 27]

第4次排序:[1, 6, 15, 18, 27]

堆排序后:[1, 6, 15, 18, 27]

趁着放假,我在家也总结了以往一些粉丝投稿给我的经验,耗时5天给大家整理出了有关以上代码与图文内容

注:篇幅有限,资料已整理成文档,查看下方名片获取!

13 道典型 Java 面试算法题及解答 思路:首先需要了解正则表达式,\d 表示数字。{n,m}表示字符个数。可以使用正则表达式从第6位之后开始截取 8 位即可取出年月日。// 测试是否为合法的身份证号码 String [ ] strs = {i ++) {// 用于提取出生日字符串 Pattern p3 = Pattern . compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日 for(int i = 0; 阅读详情

相关推荐

java面试题 常见算法

穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。与贪心算法一样,这种方法也是用来为组合优化问题设计求解算法的,所不同的是它在问题的整个可能解空间搜索,所设计出来的算法虽其时间复杂度比贪婪算法高,但它的优点是与穷举法类似,都能保证求出问题的最佳解,而且这种方法不是盲目的穷举搜索,而是在搜索过程中通过限界,可以中途停止对某些不可能得到最优解的子空间进一步搜索(类似于人工智能中的剪枝),故它比穷举法效率更高。

MaYingBo928的博客 1768

Java笔试面试-算法常用面试题

1.说一下什么是二分法?使用二分法时需要注意什么?如何用代码实现?   二分法查找(Binary Search)也称折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。  二分法使用的时候需要注意:二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。 pu...

HenryLei的博客 11万+

2025年Java高级工程师面试题精选:30道高频问题深度解析

在Java高级工程师的面试中,技术深度和广度是考察的重点。本文整理了30道高频面试题,涵盖Java基础、JVM、并发编程、集合框架、Spring框架等核心知识点,帮助你在面试中脱颖而出。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 2105

常见的Java算法面试题

常见的Java算法面试题

hao_ran_521的博客 608

【大厂面试系列】吊打面试官之leetcode高频算法面试题(最新版)

leetcode根据 2020 年 Top 30 互联网热门企业的面试情况精心挑选出的几十道高频面试题。 3|1经典题目 最大子序和【简单】 合并两个有序数组【简单】 买卖股票的最佳时机【简单】 验证回文串【简单】 二叉树的层序遍历【中等】 复制带随机指针的链表【中等】 LRU缓存机制【中等】 岛屿数量【中等】 接雨水【困难】 最小覆盖子串【困难】 3|2数组 寻找两个有序数组的中位数【困难】 盛最多水的容器【中等】 三数之和【中等】 下一个排列【中等】 搜索旋转排序数组【中

santaizinezha的博客 1112

【字节、阿里、微软、京东...】算法笔试Top20都有这些,10年刷题经验分享,不要再盲目刷题

前言 数据结构和算法可以让程序员脱胎换骨,刷算法题可以帮助我们通过面试和笔试,找到梦寐以求的工作,进入一线大厂或者拿高薪。怎么刷题呢?LeetCode上有2000多道题目,难道要全部刷完? 国内的一线大厂在面试和笔试的时候会考察什么样的题目?于是提莫抽取8个公司Top20的高频题目做了一个合并统计: 大厂LeetCode高频面试题 内容略长,选择直接查看面试题?还是不要了,耐心看完扒~ 发现存在着很大的重复性,有些题目甚至所有的公司都有考察,比如LeetCode-206.反转链表。同时这些题目所属的

豆汁 4253

2024年Java最新高频面试题:Java程序占用 CPU 过高怎么排查,带你全面掌握高级知识点

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

2401_84003554的博客 1112

大厂算法面试 7 天冲刺计划|附全套 Java 实战 & 系统设计干货

这是一个专为想要冲击大厂算法岗位的开发者设计的 7 天成长路线图,每天深挖一种核心数据结构 / 算法场景,从问题分析到多种解法实现,再到 Java 代码落地 + 面试场景还原,帮助你快速进阶,一站式掌握高频考点。

工一木子 1100

从美团运维笔试真题看运维工程师必备技能与面试准备

运维工程师面试中,网络基础、Linux命令、Shell脚本与负载均衡始终是核心考点。从TCP三次握手的状态转换到HTTP状态码的实战含义,再到DNS解析链路对故障排查的影响,每一个基础知识点都直接映射着线上业务的稳定运行。掌握CPU飙高、磁盘空间满等典型问题的定位方法,理解Nginx负载均衡算法与健康检查的配置逻辑,能让你在面对笔试和真实故障时更具条理。Shell脚本背后的自动化思维,以及故障排查中‘先宏观后微观’的分层思路,更是拉开候选人差距的关键。以美团2017年运维笔试真题为参照,梳理这些高频考点背后

weixin_34080951的博客 270

Java中级开发工程师面试核心考察维度与高频问题解析

Java作为企业级开发的主流语言,其并发编程和集合框架是面试必考重点。HashMap作为核心数据结构,JDK8通过引入红黑树优化了哈希冲突处理,与ConcurrentHashMap的线程安全实现形成对比。在并发领域,线程池参数配置和锁机制选择直接影响系统性能,合理使用CountDownLatch等工具类能有效协调多线程任务。Spring框架的IoC容器初始化过程和AOP代理机制体现了设计模式的精妙应用,而事务传播行为的理解对保证数据一致性至关重要。掌握这些原理不仅能应对技术面试,更能指导实际工程中的架构设计

weixin_30617737的博客 297

2026年Java后端面试高频真题解析:JVM、并发、Spring、数据库与分布式

Java作为企业级应用开发的核心语言,其技术体系涵盖JVM内存管理、多线程并发、Spring框架原理等基础概念。理解JVM垃圾回收机制和内存模型,能有效指导性能调优;掌握并发编程中的锁机制和线程池原理,可提升系统高并发处理能力。这些技术原理在分布式架构、微服务治理等场景中具有重要工程价值,尤其在互联网高可用系统中不可或缺。本文基于2026年一线大厂最新面试趋势,聚焦JVM性能调优和Spring框架底层机制等热词,通过真题解析帮助开发者系统性突破技术瓶颈。

weixin_33875564的博客 370

美团算法岗笔试真题解析与高频考点

数据结构与算法是计算机科学的核心基础,其中堆(Heap)和双端队列(deque)作为高效的数据结构,在解决实际问题时展现出强大的性能优势。堆结构通过优先队列实现O(log n)时间复杂度的插入与删除,广泛应用于任务调度、Top-K推荐等场景;双端队列则因其两端操作的特性,成为解决滑动窗口类问题的理想选择。在美团等互联网企业的业务场景中,这些数据结构被用于外卖配送优化、实时计算等关键系统。概率统计作为算法工程师的另一项核心能力,泊松过程建模和条件概率计算在订单预测、资源分配等业务决策中起着重要作用。掌握这些基

weixin_34210740的博客 377

Java版LeetCode高频题实战代码包,含30道面试常考题的可运行实现

这个资源包整理了30道LeetCode真实面试高频题的Java完整实现,每道题都是独立可编译运行的模块(带.iml文件,适配IntelliJ IDEA),题目覆盖经典场景:两数之和、链表相加、最长公共前缀、二叉树中序遍历、单词搜索、合并K个升序链表、被围绕的区域、加油站等。涉及的数据结构包括单链表、二叉树、图、哈希表、栈和队列;算法策略涵盖双指针、BFS/DFS、动态规划、回溯、滑动窗口、位运算、排序与查找。所有代码均通过基础测试用例验证,不依赖外部框架,开箱即用。目录命名规范,如【094】【BinaryT

255

测试工程师必会的 30 个 Linux 命令(面试版)

测试工程师Linux常用命令指南 测试工程师在工作中需掌握Linux基础命令

2301_80227052的博客 629

STM32+OOK通讯(OOK发送+OOK接收)+cubemx配置

关于OOK通信,我的理解就是将要发送的信息转换成高低电平(即0和1),然后接收方通过对01进行解码获得信息。于是我用了非常朴素的字符串转二进制+AM调制来完成通信链。话不多说我们直接开始!!!

qq_73856732的博客 2342

cadence——MOS晶体管I-V特性曲线仿真

MOS晶体管I-V特性曲线仿真 目标:使用cadence绘制晶体管的I-V特性曲线(dc仿真) 流程: 新建原理图,将MOS管的栅极电压设为变量Vg,漏极电压设为变量Vd 打开ADEL,点击Variables——Copy From Cellview添加变量;并选择dc仿真,对Vd进行扫描 以Vg作为参变量进行仿真,点击Tools——Parametric Analysis进行设置 选择漏极电流作为输出,进行仿真即可得到I-V特性曲线 ...

skycmq的博客 1万+

数据结构与算法 - 高频统计:哈希表与堆排序的结合应用

本文探讨了高频统计问题(Top-K Frequent Elements)的高效解法,结合哈希表与堆排序的优势。通过哈希表统计元素频率(O(n)时间),再使用最小堆维护Top-K元素(O(n log K)时间),显著优于暴力排序法(O(n log n))。文章详细解析了算法原理、Python实现(基于heapq)、复杂度分析,并针对元素可比性问题提出优化方案,如引入唯一ID。该组合方法适用于社交热搜、电商推荐等实际场景,在数据量巨大时仍保持高效,是算法设计与工程实践的经典范例。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 821

Java中级工程师面试核心能力与高频考点解析

JVM内存模型与并发编程是Java工程师必须掌握的底层原理。理解Metaspace替代PermGen的设计思想、synchronized与ReentrantLock的锁机制差异,能够帮助开发者编写高性能且线程安全的代码。在分布式系统设计中,CAP理论的实践权衡与分布式ID生成方案的选择直接影响系统可靠性。结合Spring框架的事务管理与Bean生命周期扩展点,可以构建更健壮的企业级应用。这些技术要点不仅是面试高频考点,更是中级开发者突破CRUD开发瓶颈的关键能力。通过MAT工具分析内存泄漏、使用jstack

weixin_33884611的博客 310

DrawCall、Batches、SetPassCalls的区别和联系

一、DrawCall、Batches、SetPassCalls的基本理解 我们先从图形渲染的角度对这些概念做一个基本的理解。 1.1 DrawCall DrawCall实际上指的是一次图形渲染接口的调用,比如OpenGL的glDrawArrays或者glDrawElements的一次调用,以及DirectX的DrawPrimitive或者DrawIndexedPrimitive。因此,DrawCall可以简单理解为一次渲染指令调用。 1.2 Batches 我们知道,在调用DrawCall之前,需要设置渲染

远行's Blog 6378

麒麟操作系统安装教程(保姆级)

本文介绍了如何在VM中安装麒麟操作系统,文章详细的介绍了麒麟操作系统按钻过步骤。

啊渊的专栏 1万+

软件测试面试核心考察点与高频真题解析

软件测试作为质量保障的关键环节,其核心方法论包括黑盒测试(等价类划分、边界值分析)和白盒测试(覆盖率指标)等基础理论。在工程实践中,自动化测试框架如Pytest与持续集成工具Jenkins的结合,能显著提升测试效率。测试工程师需要掌握从需求分析到缺陷管理的全生命周期技能,特别是在性能压测(如JMeter分布式方案)和SQL测试等实战场景中展现技术深度。本文通过大厂真题案例,剖析如何设计支持百万并发的压测方案,以及用Python实现进程监控工具等典型考察点,帮助求职者系统构建测试技术体系。

weixin_30129025的博客 236

4.4 线上vs离线:使用 Langfuse 实现智能体的全方位无死角评估

本文介绍了如何利用Langfuse工具实现AI智能体的全方位评估,包括线上和离线两种评估方式。线上评估通过收集用户实时反馈(如点赞/点踩)来监控真实表现,而离线评估则通过创建标准化数据集进行批量测试和自动评分。文章详细演示了如何为"旅小智"AI应用添加反馈功能、创建评估数据集,并利用Langfuse SDK进行自动化评估和分析。通过这两种评估方式的结合,开发者可以建立数据驱动的AI质量保障体系,实现持续优化和版本迭代。

yonggeit的博客 3318

五轮面试共计六个小时,斩获腾讯java开发岗位,30k*16 薪

背景介绍:项目是管理系统,本科 211(非科班),硕士 985(非科班)。 我面试的岗位:java 工程师 部门:新零售事业群-业务平台事业部-交易流程组 非常感谢阿里给的机会,感谢遇到的每一位面试官,面试过程很有收获。 文末有个人 JAVA 的学习经验和个人总结和收集的 Java 资源库,写的比较简单,仅仅是个人的一点经验,仅供大家参考。 阿里一面技术面 Spring bean 加载,实例化的过程 如果给你一个 map,里面有很多很多对象,那么这个 map 存放在哪 说

javaAnPou的博客 262

YOLO创新点改进点的消融实验设计规范

YOLO改进的消融实验是一种重要的方法,用于评估和验证模型中不同组件的影响。在进行YOLO改进的消融实验时,我们可以选择一些可能的改进点,比如Backbone网络、Anchor框设计和损失函数设计,然后通过实验来分析它们对模型性能的影响。首先,我们需要确定实验设计。对于每个改进点,我们将设计多个实验组,并针对每个实验组训练模型并进行性能评估。这里以三个改进点为例进行说明:改进点1:Backbone网络 (改进点2:Anchor框设计 (改进点3:损失函数设计 (

crasher123的博客 2913

数据结构之博弈树搜索(深度优先搜索)

数据结构之博弈树搜索(深度优先搜索)

LucianaiB的博客 1527
上一篇: Java NIO:从 Buffer、Channel、Selector 到 Zero-copy、I/O 多路复用
下一篇: 爱上算法,迷人的两度搜索,深度优先(DFS)和广度优先(BFS)
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值