年度流行语
虽然还有几天才正式进入 2025,但各个平台已经陆续公布了"2024 年度关键词/流行语"。
很有意思,一起来看看。
12月12日,上海《语言文字周报》发布了 2024 年的"十大网络流行语"榜单:
这十大流行语里面,每个都算耳熟,但有多少个你是明确知道意思的?
反正在刚看到榜单的时候,有一半以上的词儿,我说不出所以然 🤣🤣🤣
偷感(很重):底气不足或怕引起关注,导致整个画面画风不对 草台班子/世界是一个巨大的草台班子:不解释 班味:当代职场人一种常见的生活状态,主要表现为素面朝天、精神涣散、衣着宽松、眼中充满疲惫 那咋了:一种轻松无所谓的心态,在面对困难或质疑时,以一种满不在乎的态度回应 (就这么)水灵灵地XX:形容一种年轻、有活力的状态。这词儿本身没有太多特别的意思,更多是因为句式百搭而流行起来。最开始源于韩国女子组合采访发言 city/city不city:源自于海外博主在中国旅游时的一段对话:"上海city不city啊?","好city啊!"。因为口音独特,该词迅速走红,后来被网友发展为用来代指现代化、洋气等事物 包XX的/包的:最早以「包赢的」出现在某游戏博主的评论区。后来发展为对某件事的成功极度自信 红温:形容某人生气时面色通红的样子。基本是"急了,破防"了的进化词儿 搞抽象:代表反常规、反规则、注重个性表达的特点
那如果要你在这十个里面选一个,作为你的年度流行语,你选哪个?
我想大多数人的选择,会和「小红书」的年度关键字相同:
对此,你怎么看?你的年度关键字是什么?欢迎评论区交流。
对了,文末还有个"小忙"需要大家帮一下,十分感谢 🙏🏻
...
回归主题。
来一道和「腾讯(校招)」相关的算法题。
题目描述
平台:LeetCode
题号:873
如果序列 满足下列条件,就说它是 斐波那契式 的:
n >= 3
对于所有 i + 2 <= n
,都有
给定一个严格递增的正整数数组形成序列 arr
,找到 arr
中最长的斐波那契式的子序列的长度。如果一个不存在,返回 。
回想一下,子序列是从原序列 arr
中派生出来的,它从 arr
中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8]
是 [3, 4, 5, 6, 7, 8]
的一个子序列。
示例 1:
输入: arr = [1,2,3,4,5,6,7,8]
输出: 5
解释: 最长的斐波那契式子序列为 [1,2,3,5,8] 。
示例 2:
输入: arr = [1,3,7,11,12,14,18]
输出: 3
解释: 最长的斐波那契式子序列有 [1,11,12]、[3,11,14] 以及 [7,11,18] 。
提示:
序列 DP
定义 为使用 为斐波那契数列的最后一位,使用 为倒数第二位(即 的前一位)时的最长数列长度。
不失一般性考虑 该如何计算,首先根据斐波那契数列的定义,我们可以直接算得 前一位的值为 ,而快速得知 值的坐标 ,可以利用 arr
的严格单调递增性质,使用「哈希表」对坐标进行转存,若坐标 存在,并且符合 ,说明此时至少凑成了长度为 的斐波那契数列,同时结合状态定义,可以使用 来更新 ,即有状态转移方程:
同时,当我们「从小到大」枚举 ,并且「从大到小」枚举 时,我们可以进行如下的剪枝操作:
可行性剪枝:当出现 ,说明即使存在值为 的下标 ,根据 arr
单调递增性质,也不满足 的要求,且继续枚举更小的 ,仍然有 ,仍不合法,直接break
掉当前枚举 的搜索分支;最优性剪枝:假设当前最大长度为 ans
,只有当 ,我们才有必要往下搜索, 的含义为以 为斐波那契数列倒数第二个数时的理论最大长度。
Java 代码:
class Solution {
public int lenLongestFibSubseq(int[] arr) {
int n = arr.length, ans = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) map.put(arr[i], i);
int[][] f = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = i - 1; j >= 0 && j + 2 > ans; j--) {
if (arr[i] - arr[j] >= arr[j]) break;
int t = map.getOrDefault(arr[i] - arr[j], -1);
if (t == -1) continue;
f[i][j] = Math.max(3, f[j][t] + 1);
ans = Math.max(ans, f[i][j]);
}
}
return ans;
}
}
C++ 代码:
class Solution {
public:
int lenLongestFibSubseq(vector<int>& arr) {
int n = arr.size(), ans = 0;
unordered_map<int, int> map;
for (int i = 0; i < n; i++) map[arr[i]] = i;
vector<vector<int>> f(n, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
for (int j = i - 1; j >= 0 && j + 2 > ans; j--) {
if (arr[i] - arr[j] >= arr[j]) break;
auto it = map.find(arr[i] - arr[j]);
if (it == map.end()) continue;
int t = it->second;
f[i][j] = max(3, f[j][t] + 1);
ans = max(ans, f[i][j]);
}
}
return ans;
}
};
Python 代码:
class Solution:
def lenLongestFibSubseq(self, arr: List[int]) -> int:
n, ans = len(arr), 0
mapping = {num: idx for idx, num in enumerate(arr)}
f = [[0] * n for _ in range(n)]
for i in range(n):
j = i - 1
while j >= 0 and j + 2 > ans:
if arr[i] - arr[j] >= arr[j]:
break
t = mapping.get(arr[i] - arr[j], -1)
if t != -1:
f[i][j] = max(3, f[j][t] + 1)
ans = max(ans, f[i][j])
j -= 1
return ans
TypeScript 代码:
function lenLongestFibSubseq(arr: number[]): number {
let n = arr.length, ans = 0;
const map = new Map<number, number>();
for (let i = 0; i < n; i++) map.set(arr[i], i);
const f = Array.from({length: n}, () => Array(n).fill(0));
for (let i = 0; i < n; i++) {
for (let j = i - 1; j >= 0 && j + 2 > ans; j--) {
if (arr[i] - arr[j] >= arr[j]) break;
const t = map.has(arr[i] - arr[j]) ? map.get(arr[i] - arr[j]) : -1;
if (t === -1) continue;
f[i][j] = Math.max(3, f[j][t] + 1);
ans = Math.max(ans, f[i][j]);
}
}
return ans;
};
时间复杂度:存入哈希表复杂度为 ; DP
过程复杂度为 。整体复杂度为空间复杂度:
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
最近在参加「年度作者」评比,每个手机号每天可以投至少两票,投票时间截止于 2024-12-30,大家可以点击下方「阅读原文」直达投票现场,十分感谢,来年会更大家送更多的书籍作为福利 ~ 🙏🏻