ARTS计划2020/48

2020年第48周。本周ARTS计划继续。

Algorithm

最近忙得很,就没找专题做,随便挑了个今天热度最高的,就做了,还挺好,一个考察思考能力的题目。

https://leetcode-cn.com/problems/increasing-decreasing-string

给定的字符串,按照规则输出按照规则处理后的字符串。

例如输入abcabc,输入abccba。输入aaaabbbbcccc输出abccbaabccba,也就是先升序获取字符串中的字母,再降序获取剩下字母,且每个字母本轮中只用一次,如此反复。

这个题目看起来很简单,也是简单级别,但还是挺考察思考能力的。

一开始我设计了一个类:

1
2
3
4
public  class CharAndCount{
public char a;
public int count;
}

把String组成一个这样的List,或者数组,然后对list进行排序,然后正向遍历这个list,获取abc,然后在逆向遍历list,获取cba,每次做完之后list中的元素的count都要减一,如果count==0,那就说明没有了,跳过这个,取下一个元素。

我正准备这样写的时候,意识到英文字母只有26个,无需关心字母的大小,他们具有天然顺序,只需要一个int[26]的数据即可,字母是index + ‘a’,这样连类都不用写了,直接干,写出以下程序。

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
public String sortString(String s) {
StringBuilder builder = new StringBuilder();
int[] array = new int[26];
for (char c : s.toCharArray()) {
array[c - 'a']++;
}
boolean flag = true;

while(flag) {
flag = false;
// 正向取值
for (int i = 0; i < 26; i++) {
if (array[i] > 0) {
array[i]--;
builder.append((char) (i + 'a'));
flag = true;
}
}
// 反向取值
for (int i = 25; i >= 0; i--) {
if (array[i] > 0) {
array[i]--;
builder.append((char) (i + 'a'));
flag = true;
}
}
}
return builder.toString();
}

其实这里所谓的空间换时间并没有意义,完全就是取巧了输入只有26个,如果存在汉字的情况下,我最开始设想的方法反而好。

Review

读取了一个关于替代DsoFramer工具的替代,文章超级简单而短小,很容易读。https://officeocx.com/dsoframer-replacement.htm

Tips-SQL or Java?

我一直在骂写复杂Sql的同事,一方面我自己写SQL的水平菜到不行,另一方面无论谁去读SQL都有不少成本。所以一直以来我痛恨那些复杂sql和写复杂sql的同事,但这一周我却写了不少复杂sql,原因是我发现我用写sql的方式不仅可以带来开发效率的提升,也可以带来执行效率的提高。

例如 当我要使用复杂分类统计的时候,有几种方法 1 使用sql查询出所有细节数据,然后sql分组进行统计。2 使用简单的分组逻辑控制,多次使用sql分次查出来。3 使用2中的sql进行组合(比如union all),一次查询出所有数据,然后java稍微整理下返回。

最终我使用了3这种方案,但是这样我就成了被骂的那个写复杂sql的人,看起来好像就是就是那句我们都会成为自己讨厌的那个人。但事实并没如此,因为我的复杂sql来自于简单sql的简单拼装,导致了一个虽然很长但是逻辑相对是简单重复的sql,比较容易看懂的同时,又保证了尽可能减少了多次读数据库的网络io(不仅是次数,还有避免了1号方案的包的大小的问题)。这几乎是最优的方案,坏处只是有了一个超长SQL。

Share

分享一个在网络上看到的人口和经济的关系。翟东升老师研究人口。

50岁之后人陆续告别世界,50以上的人年龄越大人口占比自然越少,这是个自然规律,不可违背。

50岁之前的人,人口结构不确定,这里主要影响人口结构的是社会因素,这是个社会规律,可以根据历史和当前情况进行判断。

中国的TFR大约在1.5左右,这已经说明我们越生越少,已经是个发达国家。

中国的baby boomer,婴儿潮在1963-1970年左右,我的父母那一辈,这意味着父母那辈的人是个悲剧性的命运,他们必须要跟更多人的竞争才能获得好机会,并且这种悲剧是传代的,他们会几乎同时生下孩子,又一个婴儿潮(回声潮),这也就意味着,我出生的那一刻开始,就内卷了,1985-1989年左右,还好,我恰好躲过了两年。

2014年人口结构

同时更多的人受教育程度越来越高,60后的大专生已经是百里挑一(3000万人中30万-40万大学生),现在每年都有800万大学生毕业,两个里面挑一个,这是大学扩招带来的,最终就会导致低端劳动力越来越少,但大学生的就业也越来越难。

每年有2000万人离开工作市场,每年却只有1500左右参加新的工作,所以从2010年往后不需要担心中国的失业率。延迟退休一定会出现。

中国低端劳动力减少非常快

人老了就不想消费,但那时候已经存了半辈子的钱,这些钱最终会变成房子,于是在婴儿潮出生的那批人31岁买房结婚还贷款,42岁换大房子,2005直到2012年,基本上该消费的都差不多,2020年房价在那一个时刻也就停下来了,下一次到2027-2031年,回声潮的人会去消费,买更大的房子,将带来又一次的房价上升,之后中国的房地产牛市将消失。