小米
自小米 SU7 正式发售以来,小米汽车都是顺风顺水,小米集团的股票也是一路水涨船高,创始人雷军还因此"短暂"登上过首富位置。
直到几周前发生的"高速车祸"事故(3 名年轻女性夜间使用小米智驾,车辆高速撞向隔离带水泥桩,车辆起火,无人生还),一度把小米汽车拉入至暗时刻。
虽然事情目前大概率已得到处理(当事人家属已删除微博、朋友圈等相关内容),但之后的小米,一直都很低调,像进入了"寂静期"一样。
如今,这种"寂静"不仅体现在高管身上,还体现在集团的产品上。
四月都过半了,那个「在三月份,一天就要发好几条微博」的雷军,总共就发了三条微博,其中一条还是对车祸事件的回应,也就是与该事件不相关的微博,仅有两条,而且都是一些客套话。
原定于明天(2025-04-17)发布的小米最新电动车 YU7 以及 15 Pro 智能手机,目前都推迟发布,且日期未定。原定本月的举行的投资者日也推迟到了六月进行。
甚至,今年是小米成立的十五周年,原定每年一次(4月6日)的"米粉节"也没有举办。
对此,你怎么看?你觉得小米还要多久才能缓过来?欢迎评论区交流。
...
回归主题。
来一道和「校招」相关的算法题。
题目描述
平台:LeetCode
题号:1894
一个班级里有 n
个学生,编号为 0
到 n-1
。
每个学生会依次回答问题,编号为 0
的学生先回答,然后是编号为 1
的学生,以此类推,直到编号为 n-1
的学生,然后老师会重复这个过程,重新从编号为 0
的学生开始回答问题。
给你一个长度为 n
且下标从 0
开始的整数数组 chalk
和一个整数 k
。
一开始粉笔盒里总共有 k
支粉笔。当编号为 i
的学生回答问题时,他会消耗 chalk[i]
支粉笔。如果剩余粉笔数量严格小于 chalk[i]
,那么学生 i
需要补充粉笔。
请你返回需要补充粉笔的学生编号。
示例 1:
输入:chalk = [5,1,5], k = 22
输出:0
解释:学生消耗粉笔情况如下:
- 编号为 0 的学生使用 5 支粉笔,然后 k = 17 。
- 编号为 1 的学生使用 1 支粉笔,然后 k = 16 。
- 编号为 2 的学生使用 5 支粉笔,然后 k = 11 。
- 编号为 0 的学生使用 5 支粉笔,然后 k = 6 。
- 编号为 1 的学生使用 1 支粉笔,然后 k = 5 。
- 编号为 2 的学生使用 5 支粉笔,然后 k = 0 。
编号为 0 的学生没有足够的粉笔,所以他需要补充粉笔。
示例 2:
输入:chalk = [3,4,1,2], k = 25
输出:1
解释:学生消耗粉笔情况如下:
- 编号为 0 的学生使用 3 支粉笔,然后 k = 22 。
- 编号为 1 的学生使用 4 支粉笔,然后 k = 18 。
- 编号为 2 的学生使用 1 支粉笔,然后 k = 17 。
- 编号为 3 的学生使用 2 支粉笔,然后 k = 15 。
- 编号为 0 的学生使用 3 支粉笔,然后 k = 12 。
- 编号为 1 的学生使用 4 支粉笔,然后 k = 8 。
- 编号为 2 的学生使用 1 支粉笔,然后 k = 7 。
- 编号为 3 的学生使用 2 支粉笔,然后 k = 5 。
- 编号为 0 的学生使用 3 支粉笔,然后 k = 2 。
编号为 1 的学生没有足够的粉笔,所以他需要补充粉笔。
提示:
前缀和 + 二分
根据题意,每个学生消耗的粉笔为定值,所有粉笔最终会像老师的教导一样孜孜不倦地循环投入在所有的学生身上。
因此我们可以预处理出前缀和数组 ,将 对所有学生一次循环所消耗总粉笔数( )进行取模,得到最后一轮开始前的粉笔数量。
然后对前缀和数组进行二分,找到最后一位满足粉笔要求的学生,其往后一位的同学编号即是答案。
Java 代码:
class Solution {
public int chalkReplacer(int[] chalk, int k) {
int n = chalk.length;
long[] sum = new long[n + 1];
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + chalk[i - 1];
k = (int)(k % sum[n]);
int l = 1, r = n;
while (l < r) {
int mid = l + r + 1 >> 1;
if (sum[mid] <= k) l = mid;
else r = mid - 1;
}
return sum[r] <= k ? r : r - 1;
}
}
C++ 代码:
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
int n = chalk.size();
vector<long long> sumv(n + 1, 0);
for (int i = 1; i <= n; i++) sumv[i] = sumv[i - 1] + chalk[i - 1];
k = k % sumv[n];
int l = 1, r = n;
while (l < r) {
int mid = l + r + 1 >> 1;
if (sumv[mid] <= k) l = mid;
else r = mid - 1;
}
return sumv[r] <= k ? r : r - 1;
}
};
Python 代码:
class Solution:
def chalkReplacer(self, chalk: List[int], k: int) -> int:
n = len(chalk)
sumv = [0] * (n + 1)
for i in range(1, n + 1):
sumv[i] = sumv[i - 1] + chalk[i - 1]
k = k % sumv[-1]
l, r = 1, n
while l < r:
mid = l + r + 1 >> 1
if sumv[mid] <= k:
l = mid
else:
r = mid - 1
return r if sumv[r] <= k else r - 1
-
时间复杂度:预处理前缀和的复杂度为 ;二分求答案的复杂度为 。整体复杂度为 -
空间复杂度:
模拟
通过解法一,我们发现复杂度的上界为预处理前缀和的复杂度 ,同时「对单次循环消耗的总粉笔数取模操作」确保了剩余的粉笔数必然会在单次遍历中消耗完成。
因此
的二分其实是没有必要的,只需要再对 chalk
进行最后一轮的遍历模拟即可。
Java 代码:
class Solution {
public int chalkReplacer(int[] chalk, int k) {
int n = chalk.length;
long max = 0;
for (int i : chalk) max += i;
k = (int)(k % max);
for (int i = 0; i < n; i++) {
k -= chalk[i];
if (k < 0) return i;
}
return -1; // never
}
}
C++ 代码:
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
int n = chalk.size();
long long maxv = 0;
for (int num : chalk) maxv += num;
k = k % maxv;
for (int i = 0; i < n; i++) {
k -= chalk[i];
if (k < 0) return i;
}
return -1; // never
}
};
Python 代码:
class Solution:
def chalkReplacer(self, chalk: List[int], k: int) -> int:
maxv = sum(chalk)
k = k % maxv
for i in range(len(chalk)):
k -= chalk[i]
if k < 0:
return i
return -1 # never
-
时间复杂度: -
空间复杂度:
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉
本文由 mdnice 多平台发布