本来抱着了解上海未来规划去参考城市规划馆,也知道可能并得不到答案,但参观后还是有不少惊喜的。
首先的感受就是变幻的惊喜,虽然都是将过去的照片,资料与现在进行对比,但却采用了不同的形式,有的用的是影片视觉,有的用的抽拉式的卡片,有的用的是大型的图书翻页,有的是用的实物,虽然都可以用相同的形式,本质上没有什么差别,但用了不同形式表达出来,让人有了新鲜感,有了兴趣。这个方法可以参考学习, 同一个东西反复出现,就没了兴趣,但变幻一个花样,就不同了,既能从不同角度去思考,有能记忆深刻,但缺点就是要花费很多精力去构建其他东西。
二层是一个巨型的上海微缩地图,很震撼,将那么多的信息进行复刻,需要花很多精力,这也是他震撼的地方,信息量巨大,细节多。地图我们平时也精彩用,两个都是微缩为什么这个这么震撼,真实感与细节,地图上没有那么多细节的描摹,这个将每个建筑,每个河流都描绘了出来,地图是简略的,目的不同,信息量不同,比如清明上河图,就有很多细节,所以称为经典。
接着有点收获的就是上海的2017-2035年规划,我想要的就是这个,城市的大致规划,虽然我想知道城市哪块买房子更值钱,对这个帮助可能不大,但能获得这个信息,也是有个大致的指导方向,就是城市的发展目标,继续研究一下看看是不是会有什么收获。
还是那个用不同的表现形式,比如用游戏的方式,讲解生活垃圾,如果简单的展示哪些是哪些,人们记忆不清,但如果玩一个大富翁游戏,不断答题,这个效果就很好,它吸引你不断学习,停不下来。

第三章 剩余部分

这次将第三章剩余的部分看完了,但有一部分没有看懂,可能是前面基础没有打好

数组分配和访问

基本原则
指针运算
嵌套的数组
定长数组
变长数组

异质的数据结构

结构
联合
数据对齐

浮点代码

浮点传送和转换操作
过程中的浮点代码
浮点运算代码
定义和使用的浮点常数
在浮点代码中使用位级操作
浮点比较操作

整体又看完一遍,这是二刷,但还是有部分没有完成看懂,这次开始做习题,之前就是简单浏览,这次二刷比前一次好很多,但还是没有完全懂,然后我有进行了第三次了,从第三章开始,做题我发现基本都能做对的,把之前没有迷糊的地方都再一次看懂,多次学习还是有好处的,确实越学越明白,一遍不行就两遍,直到自己明白。

题目

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

使用2个数组,以最后一行为长度限制,每次上一行到下一个,下一行除了首尾,只有访问数组前一个和当前
动态规划
执行用时 :5 ms, 在所有 Java 提交中击败了64.61%的用户 内存消耗 :37.7 MB, 在所有 Java 提交中击败了60.44%的用户

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
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int height = triangle.size();
int weight = triangle.get(height-1).size();
int[] first = new int[weight];
int[] second = new int[weight];
for(int i = 0 ; i < height ; i++){
List<Integer> list = triangle.get(i);
int size = list.size();
for(int j = 0 ;j< size; j++){
if(j == 0){
second[j] = first[j]+list.get(j);
}else if(j == size-1){
second[j] = first[j-1]+list.get(j);
}else{
second[j] = Math.min(first[j-1]+list.get(j),first[j]+list.get(j));
}
}
int[] tmp = first;
first = second;
second = tmp;
}
int min = Integer.MAX_VALUE;
for(int m = 0 ; m < weight ; m++){
min = Math.min(first[m],min);
}
return min;
}
}

第五季剧情

这一季添加了报纸编辑部的故事,情节紧接上季,还是马洛团伙。市长这边因为教育资金缺乏几千万,只能紧缩财政,警察加班津贴全部没有了,空屋案也没有资金继续调查了。吉米因为跟博迪谈话,导致博迪被杀,他想借着警局新气象彻底收拾马洛团伙。但没过多久,案件就不能继续调查,他又回到从前,出轨,酗酒。甚至想着编出一个假案,去骗资源。煞费苦心地编一个杀流浪汉的故事,报社这边有一个记者斯卡特,一直想出头,就跟着编了故事,他和吉米两个人,你轮流编织这个故事,事情闹大,给了吉米这个案件很多资源,吉米将这些给了福瑞门,去查马洛,也给了其他没有资源破案的警察。最终破解了马洛的密码,在进货的时候,将马洛团伙全部抓住。但假案也让上层知道了,因为市长也因为这个竞选,所以冷处理了这个事件,但吉米和福瑞门离开警局。最后一个镜头,预览了城市的继续,马洛团伙倒台,其他人继续。生活依旧,没有什么变化,有些人变好了,有些人走了其他人的老路,不断循环。
毒贩这边,奥马尔因为乔之前阴了他,让他与马洛结仇,奥马尔直接抢劫了刚进货的乔,让所有人都没了货,赚了一大笔钱,然后隐退了。马洛一直再找奥马尔,手下干掉了奥马尔的瞎子亲戚,奥马尔回来复仇了。开始复仇被设立圈套,同伙死了,他被射伤了腿,侥幸逃脱。后面他就一个个干掉他的打手,去街头抢毒品,放话马洛没胆子上街头,但这些马洛都不知道。但不幸的是,奥马尔买东西不留神被一个小孩射死,结束了一生。
马洛跟着乔学会了洗钱,进货等手段,就将乔干掉了。马洛统一了整个巴尔的摩的毒品界,比其他人都厉害,但转瞬即逝,因为利维自己买通法院的人获取文件,只能与检察官和解,检察官这边因为假案非法窃听,获取证据不能证明,为了掩盖假案也不能进行,只能选择线下和解。马洛无罪,保留资产,但不能再犯毒,打手承担所有罪责,马洛团伙整体覆灭。
巴布斯戒毒成功,还担任志愿者,一个记者写了一篇他的报道,他算是成功证明自己,走出来阴影,最后也上楼与姐姐一起吃饭。大部分孩子走上了老路,只有跟着警长的孩子,去参与演讲,算是有一个好的结局。
我看腾讯视频上有人评价,电视剧版的红楼梦,想想还真是贴切,虽然我没有看过红楼梦,但听别人评价,红楼梦发射出当时的社会背景,让你能身临其境。我看过火线后,我感觉我都在巴尔的摩生活过一样,“看就是那样,没错”,这种错觉,里面人物鲜活,场景还原度高,各个细节表现着当时的生活的人们,比如冰与火之歌,细节丰富,每个势力有自己的标志,族训,艺术源于生活,只有充分了解生活的人,才能写出如此真实的细节。
最后一季探讨了过程正确的重要性,吉米的目标是正确的,打击毒贩,查大案,但手段无所不用其极,没有底线,虽然最终目标达成,但已经超出了底线,丢了西瓜捡芝麻。报社记者斯卡特,为了出头,编人们喜欢的新闻,突破了新闻的底线。

剧终总结

第二遍看这部剧,已经记不清第一遍看完是什么感受了,巴尔的摩栩栩如生地展现在眼前,那些人物自己活跃在生活中,那样鲜活就像我的朋友一样。希望不想第一次看那样,没有任何收获,看看有什么能在生活中用到的启迪。
吉米,从开始的为了查大毒贩,破坏指挥链,藐视权威,具有反抗精神,为了当警探,生活上酗酒,出轨。目标是正确的,但手段没有下限,一次次让自己跌入谷底,第四季去做了巡警,逐渐变好,但最后一季,又回到凶杀案组,因为事情不顺,又回到原来。他喜欢用错误去惩罚别人的错误。
吉米的凶案组的搭档邦克,与吉米相反,在相同情况下,不会像吉米一样突破底线,虽然曲折,但也破了案。
奥马尔虽然抢劫毒贩,但有自己的底线,有什么能做,什么不能做,但街头游戏逃脱不了最后的命运,死在小孩的枪口下。
丹尼斯有自己的原则,虽然一度想真的改善警局,但最终不想突破原则,被迫辞职,去做了律师,有多条路,在一个循环不行了,起码饿不死,多个技能很重要。
卡凯蒂竞选市长的时候,确实想改善警局,但当上市长上,一直不断填其他坑,反而比以前更差了,又落入只是不断为了政绩进行数字游戏。
毒贩团伙,一个不断替换,犯毒在巴尔的摩不断上演,这是一个系统问题,不是打击一两个团伙就能实质解决,大家都是进行数字游戏,大家在怪圈中不断循环

第3章 程序的机器级表示

这章主要是讲程序编译成汇编是什么样的,各种不同指令是如何对应的,如何与硬件交互的
掌握汇编就是掌握了C语言的底层能力,是c语言如何操作底层硬件的基础,可以很好的理解c语言的行为,从根源上理解不同的操作,如果遇到不能理解的C语言行为,可以检查汇编,从底层去解释,这个也是唯一能从更深层次了解C语言的方法。
了解汇编也是了解计算机组成的开端
汇编指令分为几种

访问信息

操作数指示符
数据传送指令
压入和弹出栈数据

一共16个存储64位值的通用目的寄存器
63 31 15 7 0
%rax %eax %ax %al 返回值
%rbx %ebx %bx %bl 被调用者保存
%rcx %ecx %cx %cl 第4个参数
%rdx %edx %dx %dl 第3个参数
%rsi %esi %si %sil 第2个参数
%rdi %edi %di %dil 第1个参数
%rbp %ebp %bp %bpl 被调用者保存
%rsp %esp %sp %spl 栈指针
%r8 %r8d %r8w %r8b 第5个参数
%r9 %r9d %r9w %r9b 第6个参数
%r10 %r10d %r10w %r10b 调用者保存
%r11 %r11d %r11w %r11b 调用者保存
%r12 %r12d %r12w %r12b 被调用者保存
%r13 %r13d %r13w %r13b 被调用者保存
%r14 %r14d %r14w %r14b 被调用者保存
%r15 %r15d %r15w %r15b 被调用者保存
操作数被分为3种,立即数(immediate),寄存器(register),内存引用
内存引用,又有绝对寻址、间接寻址、变址寻址,基址寻址,比例变址寻址
传送指令:movb,movw,movl,movq,movabsq
零扩展:movzbw,movzbl,movzwl,movzbq,movzwq
符号扩展:movsbw,movsbl,movswl,movsbq,movswq,movslq,cltq
压入和弹出栈:pushq,popq
算术和逻辑操作
加载有效地址
一元和二元操作
移位操作
特殊的算术操作
加载有效地址:leaq S,D
一元:INC D,DEC D,NEG D,NOT D
二元:ADD S,D SUB S,D IMUL S,D XOR S,D OR S,D AND S,D
移位:SAL k,D SHL k,D SAR k,D SHR k,D

控制

条件码
访问条件码
跳转指令
用条件控制来实现条件分支
用条件传送实现条件分支
循环
switch语言

条件码
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
CMP S1, S2
cmpb,cmpw,cmpl,cmpq
TEST S1,S2
testb,testw,testl,testq
访问条件码
sete D,setne D,sets D,setns D,setg D,setge D,setl D,setle D,seta,setae,setb,setbe
跳转指令
jmp,je,jne,js,jns,jg,jge,jl,jle,ja,jae,jb,jbe
条件控制实现条件分支:goto风格
条件传送实现条件分支:计算各个分支结构,根据数据返回结果,有限制,但效率高
循环
do-while:条件+goto
while:jump to middle,guarded-do
for:同while
switch:跳转表(jump table)

过程

运行时栈
转移控制
数据传送
栈上的局部存储
寄存器中的局部存储空间
递归过程
转移控制

call Label,call * Operand ,ret
数据传送,最大6个,使用寄存器,其他使用栈帧

题目

给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

回溯思维,深度遍历+剪枝
一度是原来数组的长度
返回条件是到达数组的长度
一度是存储的数字,
剪枝是判断在原来的空间里

解题思路

思路1

思路1,看参考答案
先遍历first,first依次与其他位进行交换,然后遍历数组下一位,first+1,直到结束
执行用时 :7 ms, 在所有 Java 提交中击败了19.51%的用户 内存消耗 :39 MB, 在所有 Java 提交中击败了50.24%的用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public List<List<Integer>> permute(int[] nums) {
int n = nums.length;
int first = 0;
List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
for(int num : nums){
list.add(num);
}
backtrace(n,first,list,result);
return result;
}
public void backtrace(int n,int first,List<Integer> list , List<List<Integer>> result){
if(first == n){
result.add(new ArrayList<>(list));
}
for(int i = first ; i< n ; i++){
Collections.swap(list,first,i);
backtrace(n,first+1,list,result);
Collections.swap(list,first,i);
}
}
}

思路2

思路就是回溯,传入要遍历的数组
执行用时 :4 ms, 在所有 Java 提交中击败了64.83%的用户 内存消耗 :38.6 MB, 在所有 Java 提交中击败了62.61%的用户

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
class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
List<Integer> list =new ArrayList<>();
List<Integer> input = new ArrayList<Integer>();
for (int i : nums)
{
input.add(i);
}
backtrack(input,list,nums.length);
return result;
}
public void backtrack(List<Integer> input,List<Integer> list,int length){
if(list.size() == length){
result.add(new ArrayList<>(list));
return;
}
for(int i = 0 ; i< input.size() ; i++){
Integer one = input.get(i);
list.add(one);
List<Integer> newList = new ArrayList(input);
newList.remove(i);
backtrack(newList,list,length);
list.remove(list.size()-1);
}
}
}

第四季
这一季的视角在教育系统,学校里的孩子。
一方面交代卡凯提竞选市长,表现了政客的方方面面,他凭借证人被杀为话题,拉现在市长下马,过程一波三折,最后如愿当上了市长,他开始是想做一些事情的,但很快他发现,市长每天面对很多难题,里面有个比喻就是每天吃屎。刚想在警察届去改观,教育预算出现了5千万的缺口,不得不拆东墙补西墙。竞争对手的互相诋毁,政客的两面三刀,活灵活现。
学校里的孩子,大部分都是学习很差的,他们最终都是要去街头的,学校是一个小的社会,提前演习。中间穿插着科尔文跟大学教授的研究项目,每个班调出几个特别有问题的孩子,组成特别班。几个孩子各不相同,蓝迪脑子很灵活,自己在学校卖一些小零食赚钱,他看到了马洛团伙的杀入方法,告诉了警察,被说成告密者,养母也因为这个受伤。麦克是个沉默寡言的孩子,拒绝别人的好处,拒绝马洛的钱,拒绝拳击教练的帮助,后面他父亲回来了,他出现了空前的敌意,甚至请马洛去让他消失,种种表现表明他可能童年受过伤害,所以才这样,他加入了马洛团伙,成了一个杀手,管理了一个街角。还是一个孩子是瑞贝的孩子,但实在不是混街头的料,最后被科尔文收养。
马洛团伙这边两个主要杀手,将人带到空置的房屋内杀害,然后封死门,表面风平浪静,其实已经死了很多人,最后秘密被发现,成立专案组。
巴布斯这边,他开始用小推车自己卖一些东西赚钱,带着一个小弟,想好好教他,但后面小弟翘课逃走了。一个混混一直抢他钱,他想找警察,但马吉去了凶杀组,交给赫克,但他啥也没发现。他想用氰化氢装做毒品,毒死抢劫者,但被小弟偷吸,间接害死了小弟。巴布斯精神崩溃。
博迪因为与麦克一起坐车走了,被杀了,他本想举报马洛,因为他们没有原则。
警察这边赫克,因为之前撞见市长的丑事而升官了,想通过监视马洛,查出问题,但过几天摄像机丢了,而且他也没走正常流程,他还编瞎话是线人给的线索,总想抄近路,这一季很多事都是他搞坏了,转看卡夫,在被卡尔文谈话后,警务水平上升,街头混混一清二楚,两个人开始差不多,现在差距很大,一个人走了捷径,但后面吃苦很多,一个人稳扎稳打,情况越来越好。
看清事物要理解其本质,科尔文发现学校的本质,一个小型社会,孩子的表现是去社会上的预演,孩子不傻,用不到的东西不学。警察抓人是数字游戏,政策变来变去是利益的权衡。不同人有不同的发展,赫克和卡夫开始觉得没人重用他们,他们自己没发现自己与别人的差距,有实力的人,即使短暂遇到挫折,但大部分时间还是很需要这样的人,这样的人随时可以东山再起,比如福瑞们,虽然被雪藏10年,但出现出手不凡,一下就被重用了。多从自身找问题,要足够实力,不抄近路,实打实的完成每件事。
要懂游戏规则,奥马尔一直抢最棘手的毒贩,因为有原则,精明,有耐心,这才能成大事。

这周看完了全部,将剩余的系统级I/O,网络编程,并发编程都看完了,还是囫囵吞枣都看一遍,细节不纠,很多也没看懂

这3部分是整部书的第三部分,讲的是程序间的交互与通信,这部分与上层的关系其他挺大的,但C语言不太会,不能跟着写脚本,所以C语言是必备,对于下面继续学习是必要的。弄懂这几部分,就算得上学习了高级部分了。

这一季,视角重回街头。
整体上,讲的是街头毒贩,巴克斯戴尔与斯坦菲尔德两个犯罪团伙的对抗。西区讲贩毒吸毒人员迁移到无人街区,使毒品合法化,带来的好处。

毒贩组,
艾文通过陷害警察一年半后欧出狱,大楼被炸,他们重新占领街头,与斯坦菲尔德团伙发生的冲突,两方火并,但艾文这边几个得力的杀手都被关入监狱,实力大减。最后要火并的时候,被警察全部抓住,整体覆灭。Stringer在艾文在监狱的时候掌管团伙,开始因为没有毒品来源,与乔做了交易,给了他3个大楼,但开始艾文不同意,他的脑子里只有占领街角,还请了穆宗大兄来看地盘,stringer为了得到毒品,就与乔使了小计,让奥马尔去以为之前杀他小弟的人来了,但奥马尔在杀穆宗的时候发现,这个人不会虐待别人,所以没有杀害,至此与奥马尔和穆宗都结下梁子。Strings思维超前,基本脱离了黑道,想通过正道赚钱,有知识,联合其他黑帮一起组成联盟。但还是被政客戏耍,在完全洗白的路上,但最后被艾文出卖,死于奥马尔和穆宗之手。
斯坦菲尔团伙刚刚崛起,在与艾文的冲突中幸存。

警察组
这一季更往上层走,市长,政客都出现。为了竞选,市长强压下来,降低死亡率,但除了加大巡逻,没有什么好办法。快退休的考文想通过其他方式做一个小实验,让毒贩都搬到某些没人的街区,让普通街区恢复正常,虽然取得了很好的效果,但毒品合法化还是不被允许,最终带着惩罚退休。
重案组,这边一直追查,Stringer的手机,手机用了一次性手机,很难窃听,拿不到证据,他们设局,步步为营,最终通过监听拿到了组织结构,再最终要逮捕的时候,Stringer被奥马尔杀了,到头来一场空。

Stringer带来组织变革走向犯罪组织,考文毒品合法化的变革,最终都失败,但都带了很大的影响。很多的问题是系统的问题,按下这头,那头起来,比如警察降低死亡率,而毒贩却在争抢地盘,越是想死亡人数少,争得越厉害,反而是毒品合法化的系统方法,很大改善了问题。

题目

翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/invert-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题思路

遍历树,然后左右交换

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
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
if(root == null)return root;
stack.push(root);
while(!stack.isEmpty()){
TreeNode node= stack.pop();
if(node.right!=null){
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
change(node);
}
return root;
}
public void change(TreeNode node){

TreeNode left = node.left;
TreeNode right = node.right;
if(left == null && right == null){
return;
}
node.right = left;
node.left = right;
}
public void travel(TreeNode node){

}
}

执行结果
执行用时 :1 ms, 在所有 Java 提交中击败了89.57%的用户 内存消耗 :34.5 MB, 在所有 Java 提交中击败了39.07%的用户