diff --git a/index.html b/index.html
index c3ec7910..4093babb 100644
--- a/index.html
+++ b/index.html
@@ -16,8 +16,7 @@
@@ -30,6 +29,8 @@
// - https://revealjs.com/initialization/
// - https://revealjs.com/config/
Reveal.initialize({
+ width: 1000,
+ height: 1000,
hash: true,
// Learn about plugins: https://revealjs.com/plugins/
diff --git a/leetcode-20230110.md b/leetcode-20230110.md
new file mode 100644
index 00000000..52da39ea
--- /dev/null
+++ b/leetcode-20230110.md
@@ -0,0 +1,149 @@
+# Leetcode 💻 寒假 20230110
+
+---
+
+### 179. Largest Number
+
+给定一个非负整数列表 nums,将它们排列成最大的数并返回。
+
+```cpp [|4-6|7-9]
+class Solution {
+public:
+ string largestNumber(vector& nums) {
+ vector v;
+ v.reserve(nums.size());
+ for (auto const &i : nums) v.push_back(to_string(i));
+ sort(v.begin(), v.end(), [](string &a, string &b) {
+ return a + b > b + a;
+ });
+ string ret;
+ for (auto const &s : v) ret += s;
+ // 处理 ["0", "0", "0"] 的情况
+ return ret.startswith('0') ? "0" : ret;
+ }
+};
+```
+
+Note:
+
+首先我们要知道对字符串进行大小比较会发生什么事情
+
+```python
+'1' + '3' < '2' # True
+'1' + '3' < '22' # True
+'1' < '11' # True
+'1' + '0' == '10' # True
+```
+
+先讲解一下这个代码在干什么
+
+4-6 先建立一个新的vector,可以理解为可变长度的数组,
+第五行预先给vector分配和nums数量一样多的内存,因为c++中的vector容器,
+包括很多其他语言的可变长度数组容器,都是会在数组容量不足的时候自动扩容数组。
+扩容是怎么扩容个法子呢,简单来说就是新建一个更大容量的数组,
+然后把原有数组的内容全部复制过去,听起来是不是效率很低?但其实编程语言在背后做了各种优化,
+比如智能估计数组的容量,提前分配空间,减少扩容次数来提升新能,所以一般来说用户无需太过担心这一部分,
+但是如果你能够提前知道这个vector会有多长,并且提前给他一次申请够需要的容量,那么肯定是能够提高性能的。
+第六行是利用的c11的自动类型推断,就是这个auto,编译器可以在编译的时候自动推断出i的类型,这是一个很好用的语法糖。
+接着是const常量,这是我个人的变成习惯,给不需要修改的变量加上const限制,这么做的好处一个是可以避免
+不小心修改了这个不该修改的变量导致莫名其妙的bug,另一个是在javascript等动态语言中const可以跳过类型检查
+稍微提高代码执行速度。
+i前面的这个符号是c11的左值引用语法,这么写就代表i是nums中的元素,是一个nums中的数字而不是数组下表,
+在后面可以直接把这个数字转成字符串,然后添加到v列表中,不需要写 nums[i] 这种东西。
+
+7-9 是对v数组进行排序,这里用了一个自定义函数来比较两个元素的大小。
+这个自定函数做什么事情呢,他传入两个字符串的引用,然后将字符串拼接起来,看看谁拼在前面会更大。
+
+10-11 行是定义一个新字符串用于返回最终结果,然后通过一个循环便利我们刚刚排序好的数组v,
+将数组中每个元素添加到这个字符串里
+
+12-13 最后我们返回值,注意这里有个边界情况,就是数组中全部都是0,
+这时候我们用一个三元表达式,如果数组开头第一个元素是0,那么直接返回字符串0,
+不然的话就正常返回ret变量。
+
+---
+
+### 179. Largest Number
+
+Python 版本
+
+```python [|4|5-7|8]
+from functools import cmp_to_key
+class Solution:
+ def largestNumber(self, nums: List[int]) -> str:
+ strs = [str(i) for i in nums]
+ strs.sort(key = cmp_to_key(
+ lambda a, b: -1 if a + b > b + a else 1
+ ))
+ return '0' if strs[0] == '0' else ''.join(strs)
+```
+
+Note:
+
+思路和刚刚的 c++ 是一样的,但我主要想给各位介绍一下python的写法,
+因为我看群里用python的人还是不少的,当然这种写法是好是坏见仁见智了,我个人认为是比较好的。
+
+4 首先我们用这个列表生成式将nums转为字符串strs, strs 是一个列表,列表中的每个元素是str(i),i是遍历nums得到的变量。
+
+5-7 接着对strs进行排序,这个cmp to key 是python3的设计,他把一个比较用来比较大小的函数变成key函数,
+这个比较函数做什么呢,他输入两个变量,如果a+b比b+a大,则这个比较函数返回-1,否则返回1,注意这里a和b的类型
+都是字符串,a+b表示的是字符串a和字符串b拼接之后的结果
+
+8 最后用一个三元表达式返回结果,和上面c++的思路是一样的,
+注意这又有一个python好用的方法,字符串.join,后面跟一个数组,
+意思是把这个数组用空字符串拼接起来
+
+---
+
+### 347. Top K Frequent Element
+
+```cpp [|4-6|]
+class Solution {
+public:
+ vector topKFrequent(vector& nums, int k) {
+ unordered_map count;
+ for (auto const &n : nums)
+ count[n]++;
+
+ vector> tmp;
+ for (auto const &pair : count)
+ tmp.push_back(pair);
+
+ sort(tmp.begin(), tmp.end(), [](
+ const pair &a,
+ const pair &b) {
+ return a.second > b.second;
+ });
+
+ vector ret;
+ for (auto const &pair : tmp) {
+ if (ret.size() >= k)
+ break;
+ ret.push_back(pair.first);
+ }
+
+ return ret;
+ }
+};
+```
+
+Note:
+
+给定一个列表,返回其中出现频率次数最高的 k 个元素。
+
+4-6 首先我第一个想到要做的事情就是统计各个数字出现的次数对吧。
+这里创建一个无序哈希表count,然后遍历nums,将对应的值加一.
+
+---
+
+### 347. Top K Frequent Element
+
+Python 版本
+
+```python []
+import collections
+class Solution:
+ def topKFrequent(self, nums: List[int], k: int) -> List[int]:
+ count = collections.Counter(nums)
+ return [i[0] for i in count.most_common()][:k]
+```