MarkDown学习笔记

MarkDown学习笔记

# 标题  
## 1. 使用 = 和 - 标记一级和二级标题
```
	语法如下:
	一级标题
	======================
	二级标题
	----------------------
```
## 2. 使用 # 标记
使用 # 号克表示 1-6 级标题, 一级标题对应一个 # 号,以此类推
```
	# 一级标题
	## 二级标题
	### 三级标题
	#### 四级标题
	##### 五级标题
	###### 六级标题
```
# 段落格式
Markdown 段落没有特殊的格式,直接编写文字就好,段落的换行是使用两个以上空格加上回车。  
当然也可以在段落后面使用一个空行来表示重新开始一个段落。

这是新段落

## 1. 字体
Markdown 可以使用以下几种字体:
```
	*斜体文本*
	_斜体文本_
	**粗体文本**
	__粗体文本__
	***粗斜体文本***
	___粗斜体文本___
```
## 2. 分隔线
在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线(效果都一样):
```
	***

	* * *

	*****

	- - -

	----------
```
## 3. 删除线
```
~~FreeLoop~~
```
## 4. 下划线
```
<u> FreeLoop</u>
```
## 5. 脚注
```
正文 [^ssss]

[^ssss]:这是一个脚注
```
# 列表
## 1. 无序列表
使用星号(*)、加号(+)或是减号(-)作为列表标记,如:

```
* 第一项
* 第二项
```
## 2. 有序列表
使用数字并加上 . 号来表示,如:
```
1. 第一项
2. 第二项
```
## 3. 列表嵌套
在子列表中的选项添加四个空格,如:
1. 第一项
	- 第一项嵌套的第一个元素
		- 再次嵌套
	- 第一项嵌套的第二个元素
2. 第二项
	- 第二项嵌套的第一个元素
	- 第二项嵌套的第二个元素

# 区块
## 1. 符号
区块引用是在段落开头使用 > 符号 ,然后后面紧跟一个空格符号
```
> 区块引用
> 666666
```
## 2. 嵌套
一个 > 符号是最外层,两个 > 符号是第一层嵌套,以此类推:
```
> 最外层嵌套
> > 第一层嵌套
> >
> > > 第二层嵌套
> > > 
```
## 3. 区块中使用列表
```
> 区块中使用列表
> 1. 第一项
> 2. 第二项
> + 第一项
> + 第二项
> + 第三项
```
## 4. 列表使用区块
* 第一项
	> 区块
	> 区块
	
* 第二项

# 代码

## 1. 针对段落
段落上的一个函数或片段的代码可以用反引号把它包起来(\`),例如:
```
`printf()`  函数
```
## 2. 代码区块
用 **```** 包裹一段代码,并指定一种语言(也可以不指定):

```javascript
  $(document).ready(function () {
      alert('111');
  });
```

# 链接
## 1. 普通方式
[链接名称](链接地址) 或者 <链接地址>
## 2. 通过变量来设置一个链接,变量赋值在文档末尾进行
这个链接用 1 作为网址变量 [Google][1]
这个链接用 baidu 作为网址变量 [BAIDU][baidu]
然后在文档的结尾为变量赋值(网址)

[1]: http://www.google.com/
[baidu]: http://www.baidu.com/

# 图片

1. 语法格式
```
   ![图片的替代文字](C:\Users\Administrator\Desktop\云办公\image-20191231153930518.png "可选标题")
````
#表格
## 1. 基本语法
使用 | 来分隔不同的单元格,使用 - 来分隔表头和其他行
```
|  表头   | 表头  |
|  ----  | ----  |
| 单元格  | 单元格 |
| 单元格  | 单元格 |
```
## 2. 对齐方式
* -: 设置内容和标题栏居右对齐。
* :- 设置内容和标题栏居左对齐。
* :-: 设置内容和标题栏居中对齐。

| 左对齐 | 右对齐 | 居中对齐 |
| :-| -: | :-: |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |
# 其他
## 1. 支持的html元素
<kbd> <b> <i> <em> <sup> <sub> <br>等 ,如:
```
使用 <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd> 重启电脑
```
## 2. 转义
```
**文本加粗** 
\*\* 正常显示星号 \*\*
```
支持一下符号前面加反斜杠插入符号
\ 反斜线
\` 反引号
\* 星号
_  下划线
{} 花括号
[] 方括号
() 小括号
\# 井字号
\+ 加号
\-  减号
\. 英文句点
\! 感叹号

## 3. 公式
使用  $$ 包裹TeX或者LaTeX格式的数学公式实现,提交后,问答和文章页会根据需要加载 Mathjax 对数学公式进行渲染。如:
$$
\mathbf{V}_1 \times \mathbf{V}_2 =  \begin{vmatrix} 
\mathbf{i} & \mathbf{j} & \mathbf{k} \\
\frac{\partial X}{\partial u} &  \frac{\partial Y}{\partial u} & 0 \\
\frac{\partial X}{\partial v} &  \frac{\partial Y}{\partial v} & 0 \\
\end{vmatrix}
${$tep1}{\style{visibility:hidden}{(x+1)(x+1)}}
$$
##  3. 画流程图、时序图(顺序图)、甘特图
1、横向流程图源码格式:

```mermaid
graph LR
A[方形] -->B(圆角)
    B --> C{条件a}
    C -->|a=1| D[结果1]
    C -->|a=2| E[结果2]
    F[横向流程图]
```
2、竖向流程图源码格式:

```mermaid
graph TD
A[方形] --> B(圆角)
    B --> C{条件a}
    C --> |a=1| D[结果1]
    C --> |a=2| E[结果2]
    F[竖向流程图]
```
3、标准流程图源码格式:

```flow
st=>start: 开始框
op=>operation: 处理框
cond=>condition: 判断框(是或否?)
sub1=>subroutine: 子流程
io=>inputoutput: 输入输出框
e=>end: 结束框
st->op->cond
cond(yes)->io->e
cond(no)->sub1(right)->op
```
4、标准流程图源码格式(横向):

```flow
st=>start: 开始框
op=>operation: 处理框
cond=>condition: 判断框(是或否?)
sub1=>subroutine: 子流程
io=>inputoutput: 输入输出框
e=>end: 结束框
st(right)->op(right)->cond
cond(yes)->io(bottom)->e
cond(no)->sub1(right)->op
```
5、UML时序图源码样例:

```sequence
对象A->对象B: 对象B你好吗?(请求)
Note right of 对象B: 对象B的描述
Note left of 对象A: 对象A的描述(提示)
对象B-->对象A: 我很好(响应)
对象A->对象B: 你真的好吗?
```
6、UML时序图源码复杂样例:

```sequence
Title: 标题:复杂使用
对象A->对象B: 对象B你好吗?(请求)
Note right of 对象B: 对象B的描述
Note left of 对象A: 对象A的描述(提示)
对象B-->对象A: 我很好(响应)
对象B->小三: 你好吗
小三-->>对象A: 对象B找我了
对象A->对象B: 你真的好吗?
Note over 小三,对象B: 我们是朋友
participant C
Note right of C: 没人陪我玩
```
7、UML标准时序图样例:

```mermaid
%% 时序图例子,-> 直线,-->虚线,->>实线箭头
  sequenceDiagram
    participant 张三
    participant 李四
    张三->王五: 王五你好吗?
    loop 健康检查
        王五->王五: 与疾病战斗
    end
    Note right of 王五: 合理 食物 <br/>看医生...
    李四-->>张三: 很好!
    王五->李四: 你怎么样?
    李四-->王五: 很好!
```
8、甘特图样例:

```mermaid
%% 语法示例
        gantt
        dateFormat  YYYY-MM-DD
        title 软件开发甘特图
        section 设计
        需求                      :done,    des1, 2014-01-06,2014-01-08
        原型                      :active,  des2, 2014-01-09, 3d
        UI设计                    :         des3, after des2, 5d
    	未来任务				   :         des4, after des3, 5d
        section 开发
        学习准备理解需求                      :crit, done, 2014-01-06,24h
        设计框架                             :crit, done, after des2, 2d
        开发                                 :crit, active, 3d
        未来任务                              :crit, 5d
        耍                                   :2d
        section 测试
        功能测试                              :active, a1, after des3, 3d
        压力测试                               :after a1  , 20h
        测试报告                               : 48h
```

Visits: 836

leetcode-棒球比赛

说明:

你现在是棒球比赛记录员。
给定一个字符串列表,每个字符串可以是以下四种类型之一:
1.整数(一轮的得分):直接表示您在本轮中获得的积分数。

  1. “+”(一轮的得分):表示本轮获得的得分是前两轮有效 回合得分的总和。
  2. “D”(一轮的得分):表示本轮获得的得分是前一轮有效 回合得分的两倍。
  3. “C”(一个操作,这不是一个回合的分数):表示您获得的最后一个有效 回合的分数是无效的,应该被移除。

每一轮的操作都是永久性的,可能会对前一轮和后一轮产生影响。
你需要返回你在所有回合中得分的总和。

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

解决思路:模拟栈

public function solution($ops)
    {
        $stack = [];
        $res = 0;
        foreach ($ops as $k=>$op) {
            switch ($op) {
                case "+":
                    count($stack) > 1 ? $end = end($stack) + $stack[count($stack)-2] : $end = end($stack);
                    array_push($stack, (int)$end);
                    $res += end($stack);
                    break;
                case "D":
                    array_push($stack, (int)(end($stack)*2));
                    $res += end($stack);
                    break;
                case "C":
                    $res -= array_pop($stack);
                    break;
                default:
                    array_push($stack, (int)$op);
                    $res += end($stack);
                    break;
            }
        }
        return $res;
    }
Visits: 931

leetcode-一周中的第几天

如何不使用自带的公式自己造轮子获取一周的星期几呢,可以使用吉姆拉森日期计算公式。

public function __construct()
    {
        $this->weeks = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    }

    /**
     * 基姆拉尔森日期公式
     * @param int $day
     * @param int $month
     * @param int $year
     * @return mixed
     */
    public function solution(int $day, int $month, int $year)
    {
        return $this->weeks[($day + 2*$month + 3*($month+1)/5 + $year + $year/4 - $year/100 + $year/400) % 7];
    }
Visits: 63

使用虚拟列减少索引的扫描行数

假设现在有一张表记录了每个人的基本信息

create TABLE `t_people` (
  `id` INT(11) DEFAULT NULL ,
  `name` VARCHAR(20) DEFAULT NULL ,
  `age` INT(11) DEFAULT NULL ,
  `info` VARCHAR(255) DEFAULT NULL
)ENGINE = InnoDB;

里面总共有三条数据

INSERT INTO test.t_people (id, name, age, info, name_fist) VALUES (1, '张三', 8, null, '张');
INSERT INTO test.t_people (id, name, age, info, name_fist) VALUES (2, '李四', 12, null, '李');
INSERT INTO test.t_people (id, name, age, info, name_fist) VALUES (3, '张三', 11, null, '张');

现在我们需要找出姓名开头是张且年龄等于8的数据。

一、我们很容易想到给表添加名字和年龄的联合索引。

ALTER TABLE t_people ADD INDEX name_age_index(name, age);

搜索语句:

EXPLAIN SELECT * FROM t_people WHERE name LIKE '张%' AND age=8;

执行结果如下,总共扫描了2行

二、使用虚拟列

ALTER TABLE t_people add name_fist VARCHAR(2) GENERATED ALWAYS
as (left(name,1)),ADD INDEX name_fist_age_index(name_fist, age);

语句如下:

EXPLAIN SELECT * FROM t_people WHERE name_fist='张' AND age=8;

执行结果如下,只扫描了1行

总结:

1.虚拟列在插入的时候不能指定值,更新的时候也不能主动修改,它的值会根据定义自动修改。

2.查询优化的过程往往就是较少扫描行数的过程。

Visits: 1793

leetcode-最大子序和

题目:

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray

动态规划解法的思路:

  • 假定第一个元素为最终返回的子序和,设为result
  • 设定数组元素相加和为 sum
  • 遍历数组,将元素相加获得的sum与result对比,取最大
  • 时间复杂度 O(n)

代码:

class MaxSubArray
{
    function solution($nums)
    {
        $result = $nums[0];
        $sum = 0;

        for ($i=1; $i < count($nums); $i++) {
            if ($sum > 0) {
                $sum += $nums[$i];
            } else {
                $sum = $nums[$i];
            }

            $result = max($result, $sum);
        }

        return $result;
    }
}

Visits: 349

leetcode-斐波那契数

class Fib
{
    //自底向上计算结果
    public function solution($N)
    {
        $current = 0;
        $next = 1;
        while ($N-- > 0) {
            $next = $next + $current;
            $current = $next - $current;
        }
        return (int)$current;
    }
}

$fib = new Fib();
$res = $fib->solution(10);

算法使用了自底向上的方法,通过迭代计算斐波那契数子问题的结果,最后获得最终结果。

复杂度分析:

  • 时间复杂度:O(N)O(N)。
  • 空间复杂度:O(N)O(N),使用了空间大小为N 的数组。

github练习仓库

题目来源:力扣中国-斐波那契数

Visits: 386

PHP中时间函数strtotime记录容易出现bug的情况

11月的时候,同事做了一个功能,大致为获取上个月的表单并提醒未提交表单的人提交,该功能在12月发布。但是在12.31号,本该提醒的是11月未提交表单的人,却提醒了12月未提交表单的人。查看代码的时候发现用的函数没有错误,于是上网搜索问题,结果原来是strtotime函数逻辑问题。

代码如下:

$subMonth=Carbon::now()->subMonth()->toDateTimeString();<br>
$year=date('Y',strtotime($subMonth));<br>
$month=date('m',strtotime($subMonth));

之后有同事提醒之前曾经看过鸟哥的博客有解释过这个问题。

date内部的对于这种事情的处理逻辑:

  • 1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
  • 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

更改代码为一下生效

$year = date("Y", strtotime('last day of last month', time()));
$month = date("m", strtotime('last day of last month', time()));

参考: http://www.laruence.com/2018/07/31/3207.html

Visits: 85