每日算法&面试题,算法特训十四天——第一天

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日算法&面试题,算法特训十四天——第一天相关的知识,希望对你有一定的参考价值。

导读

肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。我们先来搞一下让大家最头疼的一类算法题,动态规划我们将进行为时21天的养成计划。还在等什么快来一起肥学进行动态规划21天挑战吧!!

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个冲刺大厂面试专栏还有算法比赛练习我们一起加油 上岸之路

21天动态规划入门

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例 1:

输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false 
调用 isBadVersion(5) -> true 
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
示例 2:

输入:n = 1, bad = 1
输出:1
public class Solution extends VersionControl 
    public int firstBadVersion(int n) 
        int left = 1, right = n;
        while (left < right)  // 循环直至区间左右端点相同
            int mid = left + (right - left) / 2; // 防止计算时溢出
            if (isBadVersion(mid)) 
                right = mid; // 答案在区间 [left, mid] 中
             else 
                left = mid + 1; // 答案在区间 [mid+1, right] 中
            
        
        // 此时有 left == right,区间缩为一个点,即为答案
        return left;
    


给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4
示例 4:

输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:

输入: nums = [1], target = 0
输出: 0
//主要思想还是二分查找
class Solution 
    public int searchInsert(int[] nums, int target) 
        int n = nums.length;
        int left = 0, right = n - 1, ans = n;
        while (left <= right) 
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) 
                ans = mid;
                right = mid - 1;
             else 
                left = mid + 1;
            
        
        return ans;
    


面试题

3、HashMap 的扩容机制是怎样的? 一般情况下,当元素数量超过阈值时便会触发扩容。每次扩容的容量都是之前容量的 2 倍。
HashMap 的容量是有上限的,必须小于 1<<30,即 1073741824。如果容量超出了这个 数,则不再增长,且阈值会被设置为
Integer.MAX_VALUE。 JDK7 中的扩容机制 
空参数的构造函数:以默认容量、默认负载因子、默认阈值初始化数组。内部数组是空数 组。  有参构造函数:根据参数确定容量、负载因子、阈值等。
 第一次 put 时会初始化数组,其容量变为不小于指定容量的 2 的幂数,然后根据负载因 子确定阈值。  如果不是第一次扩容,则
新容量=旧容量 x 2 ,新阈值=新容量 x 负载因子 。 JDK8 的扩容机制  空参数的构造函数:实例化的 HashMap
默认内部数组是 null,即没有实例化。第一次 调用 put 方法时,则会开始第一次初始化扩容,长度为 16。 
有参构造函数:用于指定容量。会根据指定的正整数找到不小于指定容量的 2 的幂数, 将这个数设置赋值给阈值(threshold)。第一次调用
put 方法时,会将阈值赋值给容量, 然后让 阈值 = 容量 x 负载因子。  如果不是第一次扩容,则容量变为原来的 2
倍,阈值也变为原来的 2 倍。(容量和阈值 都变为原来的 2 倍时,负载因子还是不变)。 此外还有几个细节需要注意:  首次 put
时,先会触发扩容(算是初始化),然后存入数据,然后判断是否需要扩容;  不是首次
put,则不再初始化,直接存入数据,然后判断是否需要扩容;

点击直接资料领取

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

以上是关于每日算法&面试题,算法特训十四天——第一天的主要内容,如果未能解决你的问题,请参考以下文章

每日算法&面试题,大厂特训十四天——第五天(双指针)

每日算法&面试题,大厂特训十四天——第三天(双指针)

每日算法&面试题,大厂特训二十八天——第十四天(数组)

每日算法&面试题,大厂特训二十八天——第六天(双指针)

Java集训(算法&&面试题)第一天

每日算法&面试题,大厂特训二十八天——第八天(递归|回溯)