week18
171 - Excel表列序号
感觉是168的反转版, 方法类似
class Solution {
public:
int titleToNumber(string s) {
int res = 0;
for(auto x : s)
res = res * 26 + (x - 'A' + 1);
return res;
}
};172 - 阶乘后的零
一个数末尾的0 -> 取决于因式分解中能找到多少个10 -> 多少个 2 * 5;
所以质因数分解,找到2因子的个数a 5因子的个数b 取min(a, b)即可
分解质因数就是试除法 复习一下试除法求质因数
void divide(int x)
{
for(int i = 2; i <= x / i; i ++)
{
if(x % i == 0)
{
int s = 0;
while(x % i == 0) x /=i, s++;
cout << x << ' ' << s <<endl;
}
// ! 注意这里
if(x > 1) cout << x << ' ' << 1 << endl;
}
}当然 对于本题不能硬分解, 对于求n!的质因子分解;
1 - n中 p 的倍数 -> n / p 下取整1 - n中 p^2 的倍数 -> n / p^2 下取整 ...
把他们都加起来 最终得到的就是 p 的所有因子个数
举例来说

最后就是求一下5的质因子个数就好了hh
数论真的好难 学不会我本人了
173 - 二叉搜索树迭代器
提到二叉搜索树一定就是中序遍历了,二叉搜索树的充分必要条件就是中序遍历结果是有序的;
这里显然用到的是迭代形式的中序遍历-> 复习一下迭代形式的二叉树中序遍历
这里显然就是把while循环,变成每调用一次next 执行一次,hasNext 就是while的循环判断条件;
174 - 地下城游戏
倒着dp应该是 或者二分找初始值(二分:有单调性);
二分找初始值复杂度会更高一些, 倒着dp就是从终点开始,使得终点的最终健康值为0(?) 推到起始点
f[i, j]所有从(i, j)走到终点的路径中 需要的血量的最小值
此题不能直接从正向动态规划的原因是不确定起始点的值,但我们可以发现,到终点之后健康值为 1 一定是最优的。 可以考虑从终点到起点进行动态规划。 设状态 f(i,j) 表示从 (i, j) 成功到达终点,(i, j) 处需要具备的最少健康值。
初始时,f(m−1,n−1)为 −max(dungeon[m−1][n−1],0)+1,其余为正无穷。
转移时,f(i,j)=min(f(i+1,j),f(i,j+1))−dungeon[i][j] 如果 f(i,j)<=0,表示道路上的补给实在太多了,但此时健康值不能小于0,所以此时需要修正 f(i,j)=1,即下限为 1最终答案为 f(0,0)
179 - 最大数
要定义一种新的比较策略;
怎么比较A 和 B 的大小关系 -> AB 与 BA的关系 (比较谁放在前面合适)
主要是这里和数字并没什么关系。。 也找不到一个规律
记住STL重载比较函数的方式 -> 新建一个struct 重载括号
什么样的比较关系能排序呢? 全序关系
全序关系需要满足以下条件:
反对称性:若
a ≤ b且b ≤ a则a = b-> ab = ba传递性:若
a ≤ b且b ≤ c则a ≤ c->ab ≤ babc ≤ cb->ac ≤ ca这里abc ≤ bac ≤ cab ≤ cba所以abc ≤ cba所以ac ≤ ca完全性:
a ≤ b或者b ≤ a这个显然
除了自定义比较结构体之外,C++ 11 可以传入lambda 函数
[capture list] (params list) mutable exception-> return type { function body }
Last updated