0%

前情提要

  • Next 7.8.0
  • hexo 4.2.1
  • npm 6.14.5
  • Next 配置文件指 项目根目录/themes/next/_config.yml
  • 项目配置文件指 项目根目录/_config.yml
  • 注意在配置文件中配置字段时,请严格控制缩进
  • 安装命令没特别说明都在 项目根目录 下进行

以下所有配置都建立在 7.8 版本的基础之上实现的,保新保质,绝对不是复制偷搬那些祖传博客。

^_^ 友情建议:进行较大更改之前,先通过如 git 等方式进行保存。并且更改后为了避免样式不刷新,尽量先hexo clean清除样式。生成后最好先在本地hexo s部署。确认没有千疮百孔再推到线上吧。

美化性配置

虽然功能有了,但没人想要自己的博客完全单调扁平,虽然 next 的设计已经清新的挺舒服了,但人总有自定义的需求嘛。

修改途径有两种:

  • custom style 文件,覆盖单点样式,一般用于进行几个小地方的自定义等

  • custom variable 文件,修改变量,变量会被其他样式引用到,因此一般修改都是整体性的,一般用于修改文章宽度,文章颜色等整体性的样式。 >注意我在 variable 配置时发现,这里颜色字段只支持十六进制表示法,不支持 rgb 表示。

以下样式修改大多是在 styles 和 variables 两个文件中进行。

阅读全文 »

环境信息:

  • Next 7.8.0
  • hexo 4.2.1
  • npm 6.14.5
  • Next 配置文件指 **项目根目录/themes/next/_config.yml**
  • 项目配置文件指 **项目根目录/_config.yml**
  • 安装命令没特别说明都在 项目根目录 下进行
  • 注意在配置文件中配置字段时,请严格控制缩进

请根据目录章节按需阅读。所有配置都建立在2020年 7.8 版本的基础之上实现的,保新保质,绝对不是复制偷搬那些祖传博客。

在吗?吐槽无数遍,2020 的人为什么写博客还抄的 Next4.0 版本!就算你不想用 2020 大改版的版本,好歹和我一样用个 7.8 吧!!至少来个 7.0+吧孩子们!!退一万步 6.0+也是可以的啊!!

一些比较常规的功能性配置 Next 文档里都有的。虽然是英文文档,虽然可能和你的版本有一点点不同,但它是基本跟着最新版本,比较全面。另外可以多摸摸 Next 配置文件,里面注释写的蛮详细的,有些东西看注释就知道能开启什么功能,当然,有很多功能需要额外插件支持。

Next 官方手册

友情建议:进行较大更改之前,先通过git等方式进行保存。并且更改后为了避免样式不刷新,尽量先hexo clean清除样式再生成,并且最好先在本地hexo s部署。确认没有千疮百孔再推到线上吧。

阅读全文 »

求数组中的众数

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2

限制:

1 <= 数组长度 <= 50000

题目分析

题目关键词:出现次数,即我们很容易想到对次数进行统计然后查找的暴力方式,当然,没有介绍的必要。

另一个关键词:超过一半,超过一半的性质能带给我们什么优势?暴力法没有顾及到,下面介绍的抵消法/摩尔投票法则利用了这一性质进行提速。

再仔细思考题目性质:

核心性质————寻找众数,众数次数超过一半————众数次数 - 所有其他数字加起来出现的次数 0

  1. 我们可以拿出一个 众数,和 一个非众数 匹配抵消。两两抵消后,最终剩下的肯定是众数。

  2. 假设当前数是a,碰到下一个不同的数b,a和b抵消后,不管a b 和众数是什么关系。之后的数组中依然有性质————众数次数 - 所有其他数字加起来出现的次数 0 ,即a和b的抵消不影响我们在后续数组中找众数。

  3. 即我们可以按序把两两不相同的数抵消,相同的数累计起来去抵消后续不同的数。并且后续的数组中依然可以继续抵消。

  4. 这样即可递归下去,最终遍历完整个数组,把所有数抵消了一遍,我们得到剩下的数remain=众数

算法流程

  1. 取第一个数作为当前remain

  2. 遍历到下一个数

    • 假如不同,则两两抵消,由上面分析可知,不影响后面数组中最后留下的是众数。
    • 假如相同,则在count中累计起来,后面可以抵消更多的不同的数。
  3. 遍历完一整遍数组,全部抵消完毕,则最后remain保持为抵消后多余出来的众数

题解代码

抵消法做法很简单,值得注意的是理解算法的正确性,为什么这样做是对的。

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 majorityElement(vector<int& nums)
{
//抵消思路,因为次数超过一半————众数次数 - 所有其他数字加起来出现的次数 0 ,
//即取 众数一次 抵消 非众数一次 最终剩下来的就是众数
//即 假设a是众数,碰到下个数不是a, 那么这两个数抵消,剩下的数组里依然有 众数次数 - 所有其他数字加起来出现的次数 0
//最终全部抵消后,多余的是众数。

int remain;//最后剩下的肯定是全数组的众数
int count=0;//记录当前假设的众数的次数 用于抵消
int length=nums.size();
for(int i=0;i<length;i++)
{
if (count==0)//更新假设对象
{
remain=nums[i];
count++;
}
else if(nums[i]!=remain)//两两抵消
count--;
else//相同数,count++
count++;

}

return remain;
}
};

First title 一级标题 MarkDown示例

# First title 一级标题 MarkDown示例

Second title 二级标题

## Second title 二级标题

Third title 三级标题

### Third title 三级标题

Fourth 四级标题

#### Fourth 四级标题

Fifth 五级标题 下面是分割线

##### Fifth 五级标题 下面是分割线


---

1. 正文书写

## 1. 正文书写

标准正文示例.

标准正文示例.

粗体示例

**粗体示例**

斜体示例

*斜体示例*

粗斜体示例

***粗斜体示例***

引用示例

嵌套引用示例

引用示例

1
2
3
4
5
>引用示例
>
>>嵌套引用示例
>
>引用示例
  1. 有序列表示例1

    1.1. 嵌套多级列表1.1

    1.2. 嵌套多级列表1.2

    • 有序列表嵌套无序列表
  2. 有序列表示例2

    2.1. 嵌套多级列表2.1

    2.2. 嵌套多级列表2.2

1
2
3
4
5
6
7
8
9
10
11
12
13
1. 有序列表示例1

1.1. 嵌套多级列表1.1

1.2. 嵌套多级列表1.2

- 有序列表嵌套无序列表

2. 有序列表示例2

2.1. 嵌套多级列表2.1

2.2. 嵌套多级列表2.2
  • 无序列表示例1

  • 无序列表示例2

    • 嵌套无序列表2.1
    1. 无序嵌套有序
    1. 无序嵌套有序
1
2
3
4
5
6
7
8
9
- 无序列表示例1

- 无序列表示例2

- - 嵌套无序列表2.1

- 1. 无序嵌套有序

- 2. 无序嵌套有序

2. 资源插入

  1. 代码段插入示例for day in time

1. 代码段插入示例 ``for day in time``

  1. 代码块插入示例:
1
2
3
4
5
6
7
//代码块示例 第一个```后加代码名即可进行语法识别
#include <iostream>
using namespace std;
int main()
{
cout<<std;
}
1
2
3
4
5
6
7
8
9
```C++
//代码块示例 第一个```后加代码名即可进行语法识别
#include <iostream>
using namespace std;
int main()
{
cout<<std;
}
```
  1. 链接插入示例

3. [链接插入示例](www.lianjie.com)

  1. 图片插入示例:
这里是图片注释
1
![这里是图片注释](https://i.imgur.com/sVc8zeN.png)

1. 下载原markdown集

登录简书作者后台,在个人设置--账号管理--打包下载所有文章。 此时可以获得以文集为文件夹的所有markdown文章源文件

2. 利用shell脚本添加hexo元数据

需要掌握 sed修改文件shell脚本运行 - sed命令用法 - shell脚本只要你安装好了git环境,即可在命令行中通过 sh xxx.sh 运行相关脚本,至于怎么去写,有兴趣可以自己了解

以下是我使用的shell脚本:

1
2
3
4
5
6
7
8
9
10
11
for f in ./*/*;do
sed -i 's/#####\([^#]\)/##### \1/' $f
sed -i 's/####\([^#]\)/#### \1/' $f
sed -i 's/###\([^#]\)/### \1/' $f
sed -i 's/##\([^#]\)/## \1/' $f
sed -i 's/#\([^#]\)/# \1/' $f
base=$(basename $f .md)
categories=$(basename $(dirname $f) $PWD)
insert="---\ntitle: ${base}\ncategories:\n- ${categories}\ndate:2020-02-17 02:17:00\n---\n"
echo -e "${insert}$(cat $f)" > $f
done
  • 前半段为sed在#字符后添加空格,因为在简书里 #紧贴标题 也是可以成功识别的,但是其他的markdown不一定支持。这里注意需要用到的命令格式为sed -i 's/old/new' file
    • -i指在源文件上修改
    • s 指进行文本替换,但这里有一个巨大的坑点,假如old长度为3,new长度为4,那么该命令会吞掉原old后的一个字符,即它的替换是覆盖式替换,而不是删除old后插入new。
    • 因此需要使用到 () 格式,()在old中选定子字符串,然后在new中利用\number,获取第number个子字符串,即我们保存下来了会被覆盖掉的字符,然后又重新给他加了回去。
    • 为了避免在诸如#####中匹配出单个#,利用了[^c],即不匹配c字符,在这段代码中就是下一个不能是#。
  • 后半段是hexo文档评论区的大神写的,获取了目录名作为hexo的分类名,并且插入元数据,注意无法自动维护简书的时间,因此我这自己选了个日期插入。

3.运行脚本并检查文档

在简书文集解压出来的文件夹的根目录中,即在user-xxxx文件夹下,运行该脚本,等待运行完成后检查修改结果是否符合你的预期。

4.存在问题

  1. 无法维护时间
  2. 简书代码块不需要注明语言,但是这样hexo的一些highlight就无法识别,想不到自动注明语言的办法。
  3. 简述博客图片链接会失效,简书通过判断http请求头中的referer的值,如果来自本站才返回成功请求。因此可以通过修改referer复原图片链接,但是博客有些依赖referer的功能就会受影响。 可以选用外部图床,但收费的挺贵,不收费的也难用,常规的发文网如微博、CSDN、简书都限制外链,挺难找图床的。