ARTS 第7周
ARTS 第7周分享
[TOC]
Algorithm
922. Sort Array By Parity II
难度:[easy]
[思路]
- 遍历整个数组用连个容器,分别存储位置不对的奇数和偶数
- 分别从两个容器中取出一个数据,进行位置互换
[参考代码]
func sortArrayByParityII(A []int) []int {
odds := make([]int, 0)
evens := make([]int, 0)
// 遍历整个数组用连个容器,分别存储位置不对的奇数和偶数
for i, v := range A {
if i%2 == 0 && v%2 != 0 {
evens = append(evens, i)
} else if i%2 != 0 && v%2 == 0 {
odds = append(odds, i)
}
// 分别从两个容器中取出一个数据,进行位置互换
if len(odds) > 0 && len(evens) > 0 {
A[evens[0]], A[odds[0]] = A[odds[0]], A[evens[0]]
evens = evens[1:]
odds = odds[1:]
}
}
return A
}
Review
<https://golangbot.com/write-files/>
如何用golang写数据到文件
- 写字符串到文件
- 写字节到文件
- 逐行写入文件
- 向文件追加内容
- 并发的写数据到文件
Tips
分享一:
这周读的一遍文章,关于如何刷LeetCode:https://mp.weixin.qq.com/s/fECqsr3T4WKNcx7s-2ozuA
个人总结:
刷题不能蛮干,要循序渐进
- 题目难度循序渐进:从简单的题开始,即使有经验,也应该如此
- 按算法分类来刷题:一个时间段,持续地刷同一个类型的题
- 分类:
- 考察数据结构:链表、栈、队列、哈希表、图、Trie、二叉树
- 考察基础算法:深度优先、广度优先、二分查找、递归
- 考察算法思想:递归、分治、回溯搜索、贪心、动态规划
- 优点:会促使你对这个数据结构,算法有更深,更全面的理解
- 分类:
刷题的两种方式,龟系,兔系
- 龟系:每一个题目都要追求最有的解法,所以不满足于一种解法,各种解法都写一写,所以每一道题都会需要大量时间
- 兔系:使用固定的套路来刷题,先根据标签来分类,按照解该类型题的套路来刷题
- 每个标签内部也分为Easy、Medium、Hard,按照先易后难的顺序刷题,先熟悉套路,再循序渐进
解题三部曲:
- 看懂题目
- 理解清楚题目究竟要解决什么问题
- 有些题目很好理解,有些题目很隐晦
- 5分钟内看不懂,mark下来,以后做
- 分析,推导解法
- 不要去想任何实现相关的事情,不去想代码如何写
- 目的:减少心智负担
- 将思路转换成代码
- 将一个思路转换成代码的难度不一定,有时候会很难
算法的封装思想
-
封装的目的是为了重复利用
-
不仅要考虑代码层的封装,思维层的封装也很重要
-
有些已经实现过的基本算法自己就没必要再去实现一遍(元算法),可以直接调用内置函数库的(比如排序算法)
-
对于元算法:一定要刻意练习(理解 + 实现)
- 先看算法书上的描述,确保自己理解到位
- 自己尝试实现一遍
-
保持持续地动力
- 特别关注刷题的正反馈
- 老是无法解决的难题:降低难度,或更全面的复习该算法和数据结构
- 千万不要死磕,要智取,如果实在解决不了,就放弃它
分享二:
git移除文件/取消对文件的追踪
移除文件
git rm 文件
取消对文件的追踪
git rm --cached 文件
.gitignore
书写套路
第一行应该是:.gitignore
这样写的好处是,可以直接忽略掉这个文件自身,git status时就不会出现这个文件,你就可以大胆的用git add .
, 相当实用
Share
这种工作上使用ER图,所以复习了一下ER图基础概念:
ER图最主要的是是三部分:实体(entity),属性(attribute),关系(relationship)
实体:长方形表示, 一种特定的数据模型,每个实体都有自己的成员,比如学生实体就拥有张三,李四等实体成员。
属性:椭圆形表示, 这种数据模型具有的属性,例如学生模型就具有姓名, 学号, 年级等属性。
属性分为唯一属性和非唯一属性:
- 唯一属性:可以用来唯一表示一个实体中的成员,每个成员各不相同,比如学生实体的学号id,就是唯一标识一个成员
- 非唯一属性:多个成员的该属性值可以相同, 比如学生实体的性别就是非唯一的,大多数人都相同
关系:菱形表示, 用于表示实体与实体之间的关系,比如学生实体和成绩单实体,它们之间的关系就是:每个学生拥有一张成绩单
-
三种关系类型:
- 1对1:指实体模型A与实体模型B,A中的每个实体成员至多与B中的唯一个实体成员有关系,并且B中的每个实体成员至多与A中的唯一个实体成员有关系
- 1对多:实体模型A中的每个实体成员至多与B中的唯一个实体成员有关系,但是实体模型B中的一个实体成员与模型A中的多个实体成员有关系。
- 多对多:实体模型B中的一个实体成员与模型A中的多个实体成员有关系, 同时实体模型A中的一个实体成员与模型B中的多个实体成员有关系
实体补充:实体还细分为弱实体和复合实体:
-
弱实体:双菱形表示
- 一个实体必须依赖于另一个实体存在,那么前者是弱实体,后者是强实体,弱实体必须依赖强实体存在,例如上图的学生实体和成绩单实体,成绩单依赖于学生实体而存在,因此学生是强实体,而成绩单是弱实体,强实体不存在,那么弱实体就不存在。
- 弱实体和强实体的联系必然只有1:N或者1:1,
-
复合实体:长方体内加一个菱形来表示
- 还是不太理解。。
属性补充:属性还细分为复合属性、多值属性和派生属性、可选属性,同时还有用来表示联系的属性,称为联系属性。
-
复合属性:一个属性实际是由多个属性组合而成, 例如名字属性,它可以包含姓氏属性和名字属性;
- 复合属性也有唯一属性,例如学生的所在班级属性,由于多个年级都有班级,所以单单班级属性是不唯一的,但是和年级组成的复合属性后则可以匹配成唯一属性。
- 多值属性:用双线椭圆表示, 一个实体的某个属性可以有多个不同的取值,例如一本书的分类属性,这本书有多个分类,例如科学、医学等,这个分类就是多值属性
-
派生属性:用虚线椭圆表示,派生属性的值由其它属性的值计算得出
- 小组人数就是典型的派生属性,随着学生实例的参加的兴趣小组变化,小组人数属性也会变化,一般来讲派生属性不存在于数据库中,而是通过相应的公式进行计算得到,如果要放到数据库中,那么隔一段时间就要进行更新,否则会出现数据错误;
- 可选属性:在椭圆的文字后用(O)来表示,该属性的值可以为空,这就是可选属性,如地址就是一个可选属性
- 联系属性:联系属于用户表示多个实体之间联系所具有的属性,一般来讲M:N的两个实体的联系具有联系属性,在1:1和1:M的实体联系中联系属性并不必要。
本周阅读
第三周:1, 2, 3, 4, 7
-
最详细的IDEA中使用Debug教程: https://mp.weixin.qq.com/s/kWepBAGy5Hb15GfrsEiSHw
数据库的设计(E-R图,数据库模型图,三大范式): https://blog.csdn.net/Firewall5788/article/details/78112516
Part 36: Writing Files: https://golangbot.com/write-files/
微信大佬总结的算法学习经验: https://mp.weixin.qq.com/s/fECqsr3T4WKNcx7s-2ozuA
-
-
数据库ER图基础概念整理:https://zhuanlan.zhihu.com/p/29029129