hexo博客搭建——从付费到白嫖的极致体验
由于自建的博客网站域名和服务器即将到期,本人无力续费,因此选择hexo框架重建网站,主题选用轻量美观的hexo-theme-butterfly。这里记录一下搭建过程,主要感受一下从付费到白嫖的极致体验。
更新一下,由于托管图片加载速度较慢影响体验,后续更改为阿里云oss存储,有少量成本
博客搭建hexo框架
官方文档介绍得非常详细,从安装、部署到基本指令以及自定义配置等,请仔细阅读。
butterfly主题
这里我们贴出butterfly主题的官方使用文档,非常详细,建议每个文档仔细阅读:
Butterfly 安装文档(一) 快速开始
Butterfly 安装文档(二) 主题页面
Butterfly 安装文档(三) 主题配置-1
Butterfly 安装文档(四) 主题配置-2
Butterfly 进阶教程
常用命令这里整理一下常用命令,完整命令移步到 hexo框架文档 查看
new
1hexo new [layout] <title>
新建一篇文章。如果没有设置 layout 的话,默认使用 _config.yml 中的 default_layout 参数代 ...
一文详解Optional
简介当我们需要使用某个对象的属性或方法时,如果该对象为 null,则会抛出空指针异常。为了避免这种异常的发生,我们通常需要在代码中添加大量的 if-else 判断来检查对象是否为 null。这样的代码不仅繁琐,而且不易于阅读和维护。
Optional 类提供了一种更好的方式来处理 null 值。使用 Optional 类,可以将对象的可能存在或不存在的状态封装成一个容器对象,可以避免直接操作对象时出现空指针异常,同时还能让代码更加简洁和易于阅读。
Brian Goetz (Java语言设计架构师)对Optional设计意图的原话如下:
Optional is intended to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result,” and using null for such was overwhelmingly likely to cause errors.
这句话突出了三个点:
O ...
一文详解Stream流
简介Stream支持元素流功能性操作的类,例如集合上的map-reduce转换。 例如:
1int sum = widgets.stream().filter(b -> b.getColor() == RED).mapToInt(b -> b.getWeight()).sum();
这里我们使用widgets Collection<Widget>作为流的源,然后在流上执行filter-map-reduce以获得红色小部件的权重之和。(求和是一个的例子reduction操作)。
这个包中引入的关键抽象是流。流与集合有以下几种不同:
没有存储。 流不是存储元素的数据结构; 相反,它通过计算操作的流水线传送诸如数据结构,数组,生成器功能或I/O通道的源的元件。
功能性质。 流上的操作产生结果,但不会修改其来源。 例如,过滤从Stream获得的Stream会生成旧的Stream不需要的元素,而不是从源集合中删除元素。
懒惰执行。 许多流操作(如过滤,映射或重复删除)可以懒惰地实现,从而暴露优化的机会。 例如,”找到具有三个连续元音的第一个Stri ...
实现一个计算器
题目描述实现一个计算器支持+、-、*、/、(、)等,需要支持括号嵌套。
示例 1:
12输入:s = 1*2-3*5*8/4+3输出:-25
示例 2:
12输入:s = 12*4-25+6/(2+(2-1)*2-1)-4*3输出:13
示例 3:
12输入:s = 12*4-(25+6/(2+(2-1)*2-1)-4*3)输出:33
示例 4:
12输入:s = 12*4/2-(25+6/(2+(2-1)*2-1)-4*3)输出:9
我的解法思路此题与leetcode题库中的 面试题 16.26. 计算器 非常类似,不同的是此题需要处理嵌套的括号。一个比较普遍的思路就是首先处理括号,将整个表达式转换为没有括号的算式,再进行计算。
我们使用栈记录已经遍历的字符,当遇到第一个右括号时,说明是第一个嵌套最深的括号,我们依次弹出元素,直到遇到与其匹配的左括号,计算后,再次压入栈中。重复以上步骤,便可处理掉所有括号,接下来再计算算式。
代码123456789101112131415161718192021222324252627282930313233343536373839 ...
零钱兑换 II
题目描述
题目链接:518. 零钱兑换 II
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
示例1:
1234567输入:amount = 5, coins = [1, 2, 5]输出:4解释:有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1
示例2:
123输入:amount = 3, coins = [2]输出:0解释:只用面额 2 的硬币不能凑成总金额 3 。
示例2:
12输入:amount = 10, coins = [10] 输出:1
提示:
1 <= coins.length <= 300
1 <= coins[i] <= 5000
coins 中的所有值 互不相同
0 <= amount <= 5000
我的题解方法一:01背包思想思路设dp[i][j]为在前i个银币中凑成金额 ...
一和零
题目描述
题目链接:474. 一和零
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
示例1:
1234输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"1110 ...
目标和
题目描述
题目链接:494. 目标和
给你一个整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
示例1:
12345678输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标和为 3 。-1 + 1 + 1 + 1 + 1 = 3+1 - 1 + 1 + 1 + 1 = 3+1 + 1 - 1 + 1 + 1 = 3+1 + 1 + 1 - 1 + 1 = 3+1 + 1 + 1 + 1 - 1 = 3
示例2:
12输入:nums = [1], target = 1输出:1
提示:
1 <= nums.length &l ...
最后一块石头的重量 II
题目描述
题目链接:1049. 最后一块石头的重量 II
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。
示例1:
1234567输入:stones = [2,7,4,1,8,1]输出:1解释:组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
示例2:
12输入:stones = [31,26,33,21,40]输出:5
提示:
1 <= sto ...
分割等和子集
题目描述
题目链接:416. 分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例1:
123输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例2:
123输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
我的题解方法一:动态规划思路求出当前数组和,若为奇数则不可分成两个相等的子集,若和为偶数,则需要子集的和必须为和/2,也就是可以转化为从数组中选择若干数字,装入容量为和/2的背包中,是否能装满,因此转化为01背包问题。
代码1234567891011121314151617181920class Solution { public boolean canPartition(int[] nums) { ...
不同的二叉搜索树
题目描述
题目链接:96. 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例1:
12输入:n = 3输出:5
示例2:
12输入:n = 1输出:1
提示:
1 <= n <= 19
我的题解方法一:动态规划思路选择根节点,则当前树的种数则为左边子树的总数乘以右边子树的种数,即:
12//选择i为根节点,j-1为左边子树的节点个数,i-j为右边子树的节点个数dp[i] = dp[j - 1] * dp[i - j];
代码123456789101112class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1; for (int i = 1; i < dp.length; i++) { for (int j = 1; j <= i; j+ ...