英伟达狂飙,上演大象坐火箭(含外企算法原题)

英伟达市值破 2W 亿

这两天全球资本市场最大的事情就是英伟达(NVDA)公布了财报。

本来市场(分析师)的预期就高,结果财报公布比预期还要高出不少。

NVDA 直接上演「大象坐火箭」,在财报公布后的第一个交易日收涨 16.40%,成为首家市值超 2W 亿的半导体企业。

16.40% 是什么概念?差不多英伟达单日涨幅就等于我们一个阿里加网易。

再叠加最近 OpenAI 的 Sora 热潮,最近是一点质疑「卖铲人」的声音都没有了,毕竟质疑 NVDA 的空头都烦保证金去了。

普通人的如果想在投资市场参与 AI 红利,最直接的是买美股 NVDA 和 MSFT,如果受限国内市场,可以买一些纳指 ETF 变相持有两者,但需要注意溢价。

...

回归主题。

周末了来一道不太难的算法题,也是一道外企笔试中的热门题。

题目描述

平台:LeetCode

题号:950

牌组中的每张卡牌都对应有一个唯一的整数。你可以按你想要的顺序对这套卡片进行排序。

最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。

现在,重复执行以下步骤,直到显示所有卡牌为止:

  1. 从牌组顶部抽一张牌,显示它,然后将其从牌组中移出。
  2. 如果牌组中仍有牌,则将下一张处于牌组顶部的牌放在牌组的底部。
  3. 如果仍有未显示的牌,那么返回步骤 1。否则,停止行动。

返回能以递增顺序显示卡牌的牌组顺序。

答案中的第一张牌被认为处于牌堆顶部。

示例:

Java 复制代码
输入:[17,13,11,2,3,5,7]

输出:[2,13,3,11,5,17,7]

解释:
我们得到的牌组顺序为 [17,13,11,2,3,5,7](这个顺序不重要),然后将其重新排序。
重新排序后,牌组以 [2,13,3,11,5,17,7] 开始,其中 2 位于牌组的顶部。
我们显示 2,然后将 13 移到底部。牌组现在是 [3,11,5,17,7,13]。
我们显示 3,并将 11 移到底部。牌组现在是 [5,17,7,13,11]。
我们显示 5,然后将 17 移到底部。牌组现在是 [7,13,11,17]。
我们显示 7,并将 13 移到底部。牌组现在是 [11,17,13]。
我们显示 11,然后将 17 移到底部。牌组现在是 [13,17]。
我们展示 13,然后将 17 移到底部。牌组现在是 [17]。
我们显示 17。
由于所有卡片都是按递增顺序排列显示的,所以答案是正确的。

提示:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = A . l e n g t h < = 1000 1 <= A.length <= 1000 </math>1<=A.length<=1000
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = A [ i ] < = 1 0 6 1 <= A[i] <= 10^6 </math>1<=A[i]<=106
  • 对于所有的 i != jA[i] != A[j]

模拟

根据题意,我们可以先使用双端队列对 deck 进行一次模拟,并用哈希表记下每个元素 <math xmlns="http://www.w3.org/1998/Math/MathML"> d e c k [ i ] deck[i] </math>deck[i] 的显示顺序(利用 <math xmlns="http://www.w3.org/1998/Math/MathML"> d e c k [ i ] deck[i] </math>deck[i] 元素各不相同,可直接用 <math xmlns="http://www.w3.org/1998/Math/MathML"> d e c k [ i ] deck[i] </math>deck[i] 作为 key)。

随后考虑如何通过哈希表来构建答案数组 ans

假设原数组中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> d e c k [ i ] deck[i] </math>deck[i] 为首次显示的卡牌,那么 <math xmlns="http://www.w3.org/1998/Math/MathML"> a n s [ i ] ans[i] </math>ans[i] 应该放置 deck 中最小的元素,同理若 <math xmlns="http://www.w3.org/1998/Math/MathML"> d e c k [ j ] deck[j] </math>deck[j] 若最后显示的卡牌,则 <math xmlns="http://www.w3.org/1998/Math/MathML"> a n s [ j ] ans[j] </math>ans[j] 应放置 deck 中的最大元素。

为了方便找 deck 中第 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 大元素,可对 deck 进行拷贝并排序。

Java 代码:

Java 复制代码
class Solution {
    public int[] deckRevealedIncreasing(int[] deck) {
        int n = deck.length, idx = 0;
        Map<Integer, Integer> map = new HashMap<>();
        Deque<Integer> d = new ArrayDeque<>();
        for (int x : deck) d.addLast(x);
        while (!d.isEmpty()) {
            map.put(d.pollFirst(), idx++);
            if (!d.isEmpty()) d.addLast(d.pollFirst());
        }
        int[] ans = new int[n], temp = deck.clone();
        Arrays.sort(temp);
        for (int i = 0; i < n; i++) ans[i] = temp[map.get(deck[i])];
        return ans;
    }
}

C++ 代码:

C++ 复制代码
class Solution {
public:
    vector<int> deckRevealedIncreasing(vector<int>& deck) {
        int n = deck.size(), idx = 0;
        map<int, int> map;
        deque<int> d;
        for (int x : deck) d.push_back(x);
        while (!d.empty()) {
            map[d.front()] = idx++;
            d.pop_front();
            if (!d.empty()) {
                d.push_back(d.front());
                d.pop_front();
            }
        }
        vector<int> ans(n);
        vector<int> temp = deck;
        sort(temp.begin(), temp.end());
        for (int i = 0; i < n; i++) ans[i] = temp[map[deck[i]]];
        return ans;
    }
};

Python3 代码:

Python 复制代码
class Solution:
    def deckRevealedIncreasing(self, deck: List[int]) -> List[int]:
        n, idx = len(deck), 0
        map = {}
        d = deque(deck)
        while d:
            map[d.popleft()] = idx
            idx += 1
            if d:
                d.append(d.popleft())
        temp = sorted(deck)
        return [temp[map[deck[i]]] for i in range(n)]

TypeScript 代码:

TypeScript 复制代码
function deckRevealedIncreasing(deck: number[]): number[] {
    let n = deck.length, idx = 0;
    const map = {};
    const d = [...deck];
    while (d.length > 0) {
        map[d.shift()!] = idx++;
        if (d.length > 0) d.push(d.shift()!);
    }
    const ans = new Array(n);
    const temp = [...deck].sort((a, b) => a - b);
    for (let i = 0; i < n; i++) ans[i] = temp[map[deck[i]]];
    return ans;
};
  • 时间复杂度:使用队列模拟一次操作的复杂度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)(每个元素只有一次出入队机会);对原数组进行复制并排序的复杂度 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n log ⁡ n ) O(n\log{n}) </math>O(nlogn);构建答案复杂度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)。整体复杂度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n log ⁡ n ) O(n\log{n}) </math>O(nlogn)
  • 空间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

相关推荐
卸任6 分钟前
Electron霸屏功能总结
前端·react.js·electron
fengci.6 分钟前
ctfshow黑盒测试前半部分
前端
喵个咪10 分钟前
go-wind-cms 微服务架构设计:为什么基于 Kratos?
后端·微服务·cms
神奇小汤圆16 分钟前
百度面试官:Redis 内存满了怎么办?你有想过吗?
后端
喵个咪18 分钟前
Headless 架构优势:内容与展示解耦,一套 API 打通全端生态
前端·后端·cms
开心就好202519 分钟前
HTTPS超文本传输安全协议全面解析与工作原理
后端·ios
小江的记录本22 分钟前
【JEECG Boot】 JEECG Boot——数据字典管理 系统性知识体系全解析
java·前端·spring boot·后端·spring·spring cloud·mybatis
神奇小汤圆23 分钟前
Spring Batch实战
后端
喵个咪25 分钟前
传统 CMS 太笨重?试试 Headless 架构的 GoWind,轻量又强大
前端·后端·cms