理想汽车学华为利益分配的底气,找到了(含理想汽车算法原题)

理想汽车营收破千亿

关于「理想汽车」,写过两篇推文。

一篇 是写面试的,某位候选人面试理想汽车时,面试官搞错了二叉树后序遍历的基本定义,给人一种草台班子的感觉。

另外一篇 则是关于年终奖,在车企(既有传统车企,又有新能源车企)普遍裁员、降薪 和 取消年终奖的 2023,理想汽车逆势发放超额年终,给人一种遥遥领先的感觉。

如果你觉得多少有点违和,问我哪个才是理想汽车真正的一面。

我会告诉你都是。

一个公司的成功,尤其大众消费品在商业上的成功,很大程度是高度依赖于「供应链整合能力」和「产品+营销能力」。

这两个维度任何一个单拎出来都要比技术人员的整体技术水平要重要得多。

不是说技术人员水平不重要,而是在说对商业成功的贡献上,离钱(成本和营收)越近的能力优势权重越大,要补齐这些短板的难度也越大。

不管你是不是新能源车主,理想汽车在蔚小理三家里面,就是产品力最强,在各年龄段口碑覆盖率最高的一家。

以前仅有口碑,现在是口碑和销量双丰收。

理想汽车 2023 年第四季度的数据让理想汽车有了发放超额年终奖的勇气。

理想汽车 2023 全年实现营收 1238.5 亿元 同比增长 173.5%。

年营收破千亿,实现自交付以来的首次健康盈利。

难怪理想汽车 CEO 有底气说要学华为的利益分配:

虽然还是不能和比亚迪比,但理想汽车毫无疑问已经是新势力车企中的特殊存在。

过去几十年,做大众消费品的,几乎只有 Apple 一家公司是纯依靠产品力来做大做强,作为中国企业的理想汽车,我期待它会带来更多惊喜。

...

回归主线。

来做到一道「理想」一面算法原题。

题目描述

平台:LeetCode

题号:779

我们构建了一个包含 n 行( 索引从 1 开始 )的表。

首先在第一行我们写上一个 0

接下来的每一行,将前一行中的 0 替换为 011 替换为 10

例如,对于 n = 3,第 1 行是 0 ,第 2 行是 01,第 3 行是 0110

给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始)

示例 1:

makefile 复制代码
输入: n = 1, k = 1

输出: 0

解释: 第一行:0

示例 2:

makefile 复制代码
输入: n = 2, k = 1

输出: 0

解释: 
第一行: 0 
第二行: 01

示例 3:

makefile 复制代码
输入: n = 2, k = 2

输出: 1

解释:
第一行: 0
第二行: 01

提示:

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = n < = 30 1 <= n <= 30 </math>1<=n<=30
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 < = k < = 2 n − 1 1 <= k <= 2^{n - 1} </math>1<=k<=2n−1

递归(倒推验证)

整理一下条件:首行为 0,每次用当前行拓展出下一行时,字符数量翻倍(将 0 拓展为 01,将 1 拓展为 10),且字符种类仍为 01

要求我们输出第 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 行第 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 列的字符,我们可以通过「倒推验证」的方式来求解:假设第 <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 行第 <math xmlns="http://www.w3.org/1998/Math/MathML"> k k </math>k 为 1,若能倒推出首行为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 0 0 </math>0,说明假设成立,返回 1,否则返回 0

倒推验证可通过实现递归函数 int dfs(int r, int c, int cur) 来做,含义为当第 <math xmlns="http://www.w3.org/1998/Math/MathML"> r r </math>r 行第 <math xmlns="http://www.w3.org/1998/Math/MathML"> c c </math>c 列的字符为 <math xmlns="http://www.w3.org/1998/Math/MathML"> c u r cur </math>cur 时,首行首列字符为何值。同时实现该函数是容易的:

  • 若「当前列 <math xmlns="http://www.w3.org/1998/Math/MathML"> c c </math>c 为偶数且 <math xmlns="http://www.w3.org/1998/Math/MathML"> c u r = 0 cur = 0 </math>cur=0」或「当前列 <math xmlns="http://www.w3.org/1998/Math/MathML"> c c </math>c 为奇数且 <math xmlns="http://www.w3.org/1998/Math/MathML"> c u r = 1 cur = 1 </math>cur=1」时,说明当前列所在的组为 10,由此可推出其是由上一行的 1 拓展而来,结合每次拓展新行字符数量翻倍的条件,可知是由第 <math xmlns="http://www.w3.org/1998/Math/MathML"> r − 1 r - 1 </math>r−1 行的第 <math xmlns="http://www.w3.org/1998/Math/MathML"> ⌊ c − 1 2 ⌋ + 1 \left \lfloor \frac{c - 1}{2} \right \rfloor + 1 </math>⌊2c−1⌋+1 列的 1 拓展而来,递归处理;
  • 否则,同理,必然是上一行(第 <math xmlns="http://www.w3.org/1998/Math/MathML"> r − 1 r - 1 </math>r−1 行)对应位置的 0 拓展而来,递归处理。

最终,当倒推到首行时,我们找到了递归出口,直接返回 cur

Java 代码:

Java 复制代码
class Solution {
    public int kthGrammar(int n, int k) {
        return dfs(n, k, 1) == 0 ? 1 : 0;
    }
    int dfs(int r, int c, int cur) {
        if (r == 1) return cur;
        if ((c % 2 == 0 && cur == 0) || (c % 2 == 1 && cur == 1)) return dfs(r - 1, (c - 1) / 2 + 1, 1);
        else return dfs(r - 1, (c - 1) / 2 + 1, 0);
    }
}

TypeScript 代码:

TypeScript 复制代码
function kthGrammar(n: number, k: number): number {
    function dfs(r: number, c: number, cur: number): number {
        if (r == 1) return cur
        if ((c % 2 == 0 && cur == 0) || (c % 2 == 1 && cur == 1)) return dfs(r - 1, Math.floor((c - 1) / 2) + 1, 1)
        else return dfs(r - 1, Math.floor((c - 1) / 2) + 1, 0)
    }
    return dfs(n, k, 1) == 0 ? 1 : 0
}

Python 代码:

Python 复制代码
class Solution:
    def kthGrammar(self, n: int, k: int) -> int:
        def dfs(r, c, cur):
            if r == 1:
                return cur
            if (c % 2 == 0 and cur == 0) or (c % 2 == 1 and cur == 1):
                return dfs(r - 1, (c - 1) // 2 + 1, 1)
            else:
                return dfs(r - 1, (c - 1) // 2 + 1, 0)
        return 1 if dfs(n, k, 1) == 0 else 0
  • 时间复杂度: <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 ( 1 ) O(1) </math>O(1)

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

欢迎关注,明天见。

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

相关推荐
想用offer打牌1 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
崔庆才丨静觅1 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX2 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅3 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法3 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端