Algorithm
lc3272_统计好整数的数目
思路:
暴力肯定是直接遍历数位所有的回文串,然后排除不合法整数以及没法整除k的数。
但是应该要利用k生成指定回文串,满足n数位,最终返回满足条件的回文整数数目。
排列组合所有的数,这样更好计算。
k的各种倍数,全部上去组合,直到超过n数位?
这个感觉还是竞赛题,现在想不出就学习一下题解。
挺复杂的,看完题解醍醐灌顶,但是二次出现估计还是很难做出,当成培养训练思维了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
use std::collections::HashSet;
impl Solution {
pub fn count_good_integers(n: i32, k: i32) -> i64 {
let mut dict: HashSet<String> = HashSet::new();
let base = 10i32.pow(((n - 1) / 2) as u32);
let skip = (n & 1) as usize;
/* 枚举 n 个数位的回文数 */
for i in base..base * 10 {
let s = i.to_string();
// 这里的skip用于处理奇数长度的回文数
// 当n为奇数时,skip=1,表示我们需要跳过中间的数字
// 例如:对于12321这样的回文数,我们有前半部分"12"和后半部分"21"
// 中间的"3"只需要出现一次,所以在反转后半部分时需要跳过它
let rev: String = s.chars().rev().skip(skip).collect();
let combined = format!("{}{}", s, rev);
let palindromicInteger: i64 = combined.parse().unwrap();
/* 如果当前回文数是 k 回文数 */
if palindromicInteger % (k as i64) == 0 {
let mut sorted_chars: Vec<char> = combined.chars().collect();
sorted_chars.sort();
dict.insert(sorted_chars.into_iter().collect());
}
}
let mut factorial = vec![1i64; (n + 1) as usize];
for i in 1..=n as usize {
factorial[i] = factorial[i - 1] * (i as i64);
}
let mut ans = 0i64;
for s in dict {
let mut cnt = vec![0; 10];
for c in s.chars() {
cnt[c.to_digit(10).unwrap() as usize] += 1;
}
/* 计算排列组合 */
let mut tot = (n as i64 - cnt[0] as i64) * factorial[(n - 1) as usize];
for &x in cnt.iter() {
tot /= factorial[x];
}
ans += tot;
}
ans
}
}
|
Review
过早的实现术业专攻并不一定意味着事业成功【TED演讲】
社会上通常经常说1w小时理论,但是1w小时理论可能需要更多的刻意练习和热爱。
并且专才可能视野比较局限,对于变化很快的环境可能不一定很适应。
所以在没找到自己热爱之前,或者热爱不再后,不妨大胆多尝试,不断寻找适合自己的职业,不要局限了自己。
Tip
长文件名删除
如果文件名过长,删除rm,mv,unlink
不掉,可以先备份整个目录,然后删除,再恢复。
1
2
3
|
mv /path/to/directory /path/to/backup
rm -rf /path/to/directory
mv /path/to/backup /path/to/directory
|
Share
关于社交的认知偏见
自己以前总是觉得独立解决问题很棒,对于那些问题没怎么研究清楚就疯狂跑去问学长学姐导师的人感觉很不耻。
直到看了一个视频,讲得是不会利用资源更好地沟通快速把事情干成,而是从道德上批判那些利用资源的人,最终只会得到更低的效率,而不是更高的生产效率更多的价值收益。
然后自己才意识到社交能更高效整合利用资源,从而促成一件事情,所以要学会及时社交沟通。