每日算法&面试题,算法特训十四天——第一天
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学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。
以上是关于每日算法&面试题,算法特训十四天——第一天的主要内容,如果未能解决你的问题,请参考以下文章