力扣周赛251期(上)

207 阅读1分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

1945. 字符串转化后的各位数字之和

截屏2021-08-13 下午9.14.03.png

思路分析

力扣第一题,向来是遍历。这道题无非是先讲字母字符串转化为数字,需要注意的是a代表1而不是我们常写的0,因此有

for(int i = 0; i < s.size(); i ++){
    tmp += to_string((s[i] - 'a') + 1);
}

同时根据k的大小,将每位数字求和并再次转化为字符串。然而这里很容易出一个问题导致自己算错,就是将字符转化为int的时候,是用ascii码转化的,这和我们的预期数值不符。因此改为

for(int i = 0; i < tmp.size(); i ++){
    ret += int(tmp[i] - '0');
}

即可。

1948. 删除系统中的重复文件夹

截屏2021-08-13 下午9.56.06.png

思路分析

这道题如果是穷举的思路的话,无疑是很难穷举的,要将所有可能的两个节点都遍历一次dfs,n方本身是没有多难,但每对节点都要dfs未免伤脑筋,因此我们要想办法记录某节点的子树,只要量化了这个点,就可以轻松的进行n方比较了。

如图

image.png

文件夹 a\texttt{a} 的子树的括号表达式为 (x(y))(z)\texttt{(x(y))(z)}.对于value,就使用这个表达式出现的次数,即每次获取到都++。

这样就可以在一次遍历的过程中使用dfs获取每个节点的值,然后再dfs删除所有待删除节点(即map中该节点生成的表达式的数量!=1)即可。

这道题并没有写出代码,归根到底是自己字典树比较薄弱,周末考虑做一期字典树特别篇。