本文主要是介绍背道而驰的两家企业,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写在前面
先给昨天的 推文 做个更新。
昨天说到,抖音官方辟谣了收购饿了么的事情。
当天,阿里发生较大的人事变动,然后再次传出「盒马」和「饿了么」摆上货架的事情,随后又被快速否认。
当一个假消息被反复而又密集地提起,说明大概率不全是假消息。
尤其这个假消息背后还有及其显然的逻辑。
我们可以拭目以待,子弹估计很快就要落地了。
如果是真的,对阿里是利好,说明阿里开始重新梳理,什么才是自己的主线业务。
利用大流量进行扩张,效仿腾讯,是国内每家互联网或多或少都犯过的错。
以前互联网意气风发的时候,这套逻辑可以说成是"低成本试错"。
用大厂优势,一个赛道上难怕做到业内第二第三名,都能分到不少蛋糕。
按如今国际行情和国内监管力度,不仅仅是资本不愿意听此类故事,而是压根没有多少资本还愿意公平地正视中国企业。
主营业务只要不保持好看的增速,就是退步,更别说这些烧钱项目。
与正在逐步走回正确道路的阿里,另外一个背道而驰的企业是「格力」。
月 日,格力以 亿购入格力钛 % 股份,有准备完全接盘格力钛的意思。
这里给不了解「格力钛」的同学科普一下,这是一家当时董明珠个人投了至少 亿搞的公司,注意是个人。
当时还拉上了万达的王健林和京东的刘强东。
结果格力钛翻车了,年年亏损,负债率达 % 以上。
就这么一家公司,董明珠还曾经在股东大会上,推动上市公司去收购它,自然遭受了股东们的强烈反对。
和谈不成,现在董明珠正打算通过自己的手段,以「格力」的名义把「格力钛」高溢价地接下来。
股民自然用脚投票,格力电器当日大跌 个点。
格力董小姐这一通操作,是国内大多数上市企业家的缩影。
在他们眼中,上市融得的钱是理所应当。
给自己发高工资,低价回购用于激励高管,或干脆是做来做自己喜欢的事,乐此不疲。
在这里,没有共赢。
--
好了,每日「点评世间万物」的环节结束。
回到主线任务,做一道与主角之一「字节跳动」相关的题目。
题目描述
平台:LeetCode
题号:440
给定整数 和 ,返回 中字典序第 小的数字。
示例 1:
输入: n = 13, k = 2
输出: 10
解释: 字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]
所以第二小的数字是 10。
示例 2:
输入: n = 1, k = 1
输出: 1
提示:
计数模拟
寻找字典序第 小的数。
我们可以将该过程分两步操作 :「确定前缀」和「从以某个前缀开始找目标值」。
假定我们存在某个函数 int getCnt(int x, int limit)
,该函数实现了统计范围 内以 为前缀的数的个数。
有了该函数之后,我们可以从最小的前缀 开始枚举,假设当前枚举到前缀 ,根据 与 的大小关系进行分情况讨论:
-
:说明所有以 为前缀的数组均可跳过,此时让 自增, 减去 。含义为从下一个「数值比 大」的前缀中找目标值; -
:说明目标值前缀必然为 ,此时我们需要在以 为前缀的前提下找目标值。此时让 乘 , 减 (代表跳过了 本身)。含义为从下一个「字典序比 大」的前缀中找目标值。
当 时,当前前缀 即是答案(含义为以 为前缀的所有数中,最小的数,也就是 本身)。
然后重点看看 int getCnt(int x, int limit)
函数如何实现。
为了方便,记 的位数为 , 位数为 。
根据 getCnt
的函数定义,在范围 内,以 为前缀的数值数量等于下面所有情况的数量之和:
-
位数为 的数:仅有 本身,共 个; -
位数为 的数,有 x0
到x9
,共 个; -
位数为 的数,有 x00
到x99
,共 个; -
... -
位数为 的数,此时根据「 长度与 等同的前缀 」和「 」的大小关系,进一步分情况讨论(举个 🌰,当 , 为 时, ,两者位数相差 位): -
:此时所有位数为 的数均大于 ,合法个数为 ; -
:此时所有位数为 的数中部分满足 限制,合法个数为 个(只有 为合法数); -
:此时所有位数为 的数均小于 ,合法个数为 。
-
Java 代码:
class Solution {
public int findKthNumber(int n, int k) {
int ans = 1;
while (k > 1) {
int cnt = getCnt(ans, n);
if (cnt < k) {
k -= cnt; ans++;
} else {
k--; ans *= 10;
}
}
return ans;
}
int getCnt(int x, int limit) {
String a = String.valueOf(x), b = String.valueOf(limit);
int n = a.length(), m = b.length(), k = m - n;
int ans = 0, u = Integer.parseInt(b.substring(0, n));
for (int i = 0; i < k; i++) ans += Math.pow(10, i);
if (u > x) ans += Math.pow(10, k);
else if (u == x) ans += limit - x * Math.pow(10, k) + 1;
return ans;
}
}
C++ 代码:
class Solution {
public:
int findKthNumber(int n, int k) {
int ans = 1;
while (k > 1) {
int cnt = getCnt(ans, n);
if (cnt < k) {
k -= cnt; ans++;
} else {
k--; ans *= 10;
}
}
return ans;
}
int getCnt(int x, int limit) {
string a = to_string(x), b = to_string(limit);
int n = a.length(), m = b.length(), k = m - n;
int ans = 0, u = stoi(b.substr(0, n));
for (int i = 0; i < k; i++) ans += pow(10, i);
if (u > x) ans += pow(10, k);
else if (u == x) ans += limit - x * pow(10, k) + 1;
return ans;
}
};
Python 代码:
class Solution:
def findKthNumber(self, n: int, k: int) -> int:
def get_cnt(x, limit):
a, b = str(x), str(limit)
n, m = len(a), len(b)
k = m - n
ans = 0
u = int(b[:n])
for i in range(k):
ans += int(pow(10, i))
if u > x:
ans += int(pow(10, k))
elif u == x:
ans += limit - x * int(pow(10, k)) + 1
return ans
ans = 1
while k > 1:
cnt = get_cnt(ans, n)
if cnt < k:
k, ans = k - cnt, ans + 1
else:
k, ans = k - 1, ans * 10
return ans
TypeScript 代码:
function findKthNumber(n: number, k: number): number {
const getCnt = function(x: number, limit: number): number {
const a = String(x), b = String(limit);
const n = a.length, m = b.length, k = m - n;
let ans = 0;
let u = parseInt(b.substring(0, n));
for (let i = 0; i < k; i++) ans += Math.pow(10, i);
if (u > x) ans += Math.pow(10, k);
else if (u == x) ans += limit - x * Math.pow(10, k) + 1;
return ans;
};
let ans = 1;
while (k > 1) {
let cnt = getCnt(ans, n);
if (cnt < k) {
k -= cnt; ans++;
} else {
k--; ans *= 10;
}
}
return ans;
};
-
时间复杂度:枚举前缀以及 getCnt
操作均与位数相关,复杂度均为 。整体复杂度为 -
空间复杂度:忽略子串生成复杂度为 ,否则为
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉
这篇关于背道而驰的两家企业的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!