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

理想汽车营收破千亿

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

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

另外一篇 则是关于年终奖,在车企(既有传统车企,又有新能源车企)普遍裁员、降薪 和 取消年终奖的 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)

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

欢迎关注,明天见。

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

相关推荐
zhoupenghui1686 分钟前
golang时间相关函数总结
服务器·前端·golang·time
孤雪心殇8 分钟前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
White graces20 分钟前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
庸俗今天不摸鱼20 分钟前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设
菠菠萝宝21 分钟前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
bubusa~>_<44 分钟前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
A_one20101 小时前
前端开发常见问题与面试-02
面试·职场和发展
流烟默2 小时前
vue和微信小程序处理markdown格式数据
前端·vue.js·微信小程序
梨落秋溪、2 小时前
输入框元素覆盖冲突
java·服务器·前端
小突突突2 小时前
模拟实现Java中的计时器
java·开发语言·后端·java-ee