Qeuroal's Blog

静幽正治

题目

解析

  1. 解析图:
  2. 首先,如果是Null,那么,便返回0
  3. 然后,看左子树深度和右子树的深度
  4. 接着,如果有左子树或者右子树的深度为0,那么返回另一个深度+1
  5. 最后,如果左右子树的深度都不为0,那么返回最小值+1

代码

1
2
3
4
5
6
7
8
9
int minDepth(TreeNode* root) {
if(!root)
return 0;
int leftNum = minDepth(root -> left);
int rightNum = minDepth(root -> right);
if(!leftNum || !rightNum)
return (leftNum + rightNum + 1);
return min(leftNum, rightNum) + 1;
}

题目

解析

  1. 以第k位为例
  2. 假设所有数字的第k位为:1 0 1 0
  3. 汉明距离与 0 1的个数有关
  4. 第k位汉明距离总和为 $num_0 * num_1$

【其中】:
1. $num_0$:数字0的个数
2. $num_1$:数字1的个数

代码

1
2
3
4
5
6
7
8
9
10
11
12
int totalHammingDistance(vector<int>& nums) {
int res = 0;
for(int i = 0; i < 31; i++) {
int ones = 0;
for(auto x : nums) {
if(x >> i & 1)
ones++;
}
res += ones * (nums.size() - ones);
}
return res;
}

题目

解析

  1. 与&只要有一个为0,则与的所有数为0
  2. 对每个 分别判断是否有0
  3. 首先判断m的第i位是否为0
  4. 然后判断第i位为0,且$>$m的最小的数是否大于n,如果大于,则这些都为1

代码

1
2
3
4
5
6
7
8
9
10
int rangeBitwiseAnd(int m, int n) {
int res = 0;
for(int i = 0; (1ll << i) <= m; i++) {
if(m >> i & 1) {
if(((m & ~((1ll << i) - 1)) + (1ll << i)) > n)
res += (1 << i);
}
}
return res;
}

题目描述

解析

  1. 利用异或运算的性质
    1. x ^ x = 0
    2. x ^ 0 = x
  2. 对所有数字异或运算
    1. $x_1$ ^ $x_2$ ^ …… ^ $x_n$ = 只出现过一次的数
  3. 程序
    1
    2
    3
    4
    5
    6
    int singleNumber(vector<int>& nums) {
    int res = 0;
    for(auto x : nums)
    res ^= x;
    return res;
    }

题目

解析

  1. 所有元素只有两个出现一次,其余的出现两次,那么对所有的元素求异或和,那么最后求出来的肯定是出现过一次元素的异或和
  2. 接着,因为这两个元素不同,所以,这两个数字的异或和肯定有一位为1,假设第k位为1
  3. 那么将第k位为1的分为一堆,其余的分为另一堆
  4. 接下来的问题就是 列表中只有一个出现一次的数字,其余的出现两次这个问题了

【释】:这两堆肯定是第k位为1的为一堆,该堆中只有一个出现过一次,其余的数出现两次,最后,对这两堆分别求异或和就可以求出来了

代码1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> singleNumber(vector<int>& nums) {
int s = 0;
for(auto x : nums)
s ^= x;
int k = 0;
while( !(s >> k & 1) )
k++;
int s1 = 0, s2 = 0;
for(auto x : nums)
if(x >> k & 1)
s1 ^= x;
else
s2 ^= x;
return vector<int>({s1, s2});
}

代码2

1
2
3
4
5
6
7
8
9
10
11
12
13
vector<int> singleNumber(vector<int>& nums) {
int s = 0;
for(auto x : nums)
s ^= x;
int k = 0;
while( !(s >> k & 1) )
k++;
int s1 = 0;
for(auto x : nums)
if(x >> k & 1)
s1 ^= x;
return vector<int>({s1, s ^ s2});
}

【释】:因为 $s_1$ ^ $s_2$ = s,那么 s ^ $s_1$ = $s_2$,具体性质详见 位运算的知识点以及常用技巧

init

1
$ hexo init [folder]

folder: 文件夹名字,或者说是博客名字。

新建一个网站。如果没有设置 folder ,Hexo 默认在目前的文件夹建立网站。

new

1
$ hexo new [layout] <title>

新建一篇文章。如果没有设置 layout 的话,默认使用 _config.yml 中的 default_layout 参数代替。如果标题包含空格的话,请使用引号括起来。

1
$ hexo new "post title with whitespace"
参数 描述
-p, --path 自定义新文章的路径
-r, --replace 如果存在同名文章,将其替换
-s, --slug 文章的 Slug,作为新文章的文件名和发布后的 URL

默认情况下,Hexo 会使用文章的标题来决定文章文件的路径。对于独立页面来说,Hexo 会创建一个以标题为名字的目录,并在目录中放置一个 index.md 文件。你可以使用 --path 参数来覆盖上述行为、自行决定文件的目录:

1
hexo new page --path about/me "About me"

以上命令会创建一个 source/about/me.md 文件,同时 Front Matter 中的 title"About me"

注意!title 是必须指定的!如果你这么做并不能达到你的目的:

1
hexo new page --path about/me

此时 Hexo 会创建 source/_posts/about/me.md,同时 me.md 的 Front Matter 中的 title 为 "page"。这是因为在上述命令中,hexo-clipage 视为指定文章的标题、并采用默认的 layout

generate

1
$ hexo generate

生成静态文件。

选项 描述
-d, --deploy 文件生成后立即部署网站
-w, --watch 监视文件变动
-b, --bail 生成过程中如果发生任何未处理的异常则抛出异常
-f, --force 强制重新生成文件 Hexo 引入了差分机制,如果 public 目录存在,那么 hexo g 只会重新生成改动的文件。 使用该参数的效果接近 hexo clean && hexo generate
-c, --concurrency 最大同时生成文件的数量,默认无限制

该命令可以简写为

1
$ hexo g

publish

1
$ hexo publish [layout] <filename>

发表草稿。

server

1
$ hexo server

启动服务器。默认情况下,访问网址为: http://localhost:4000/http://127.0.0.1:4000/

选项 描述
-p, --port 重设端口
-s, --static 只使用静态文件
-l, --log 启动日记记录,使用覆盖记录格式

deploy

1
$ hexo deploy

部署网站。

参数 描述
-g, --generate 部署之前预先生成静态文件

该命令可以简写为:

1
$ hexo d

render

1
$ hexo render <file1> [file2] ...

渲染文件。

参数 描述
-o, --output 设置输出路径

migrate

1
$ hexo migrate <type>

从其他博客系统 迁移内容

clean

1
$ hexo clean

清除缓存文件 (db.json) 和已生成的静态文件 (public)。

在某些情况(尤其是更换主题后),如果发现您对站点的更改无论如何也不生效,您可能需要运行该命令。

list

1
$ hexo list <type>

列出网站资料。

version

1
$ hexo version

显示 Hexo 版本。

选项

安全模式

1
$ hexo --safe

在安全模式下,不会载入插件和脚本。当您在安装新插件遭遇问题时,可以尝试以安全模式重新执行。

调试模式

1
$ hexo --debug

在终端中显示调试信息并记录到 debug.log。当您碰到问题时,可以尝试用调试模式重新执行一次,并 提交调试信息到 GitHub

简洁模式

1
$ hexo --silent

隐藏终端信息。

自定义配置文件的路径

1
2
3
4
5
# 使用 custom.yml 代替默认的 _config.yml
$ hexo server --config custom.yml

# 使用 custom.yml 和 custom2.json,其中 custom2.json 优先级更高
$ hexo generate --config custom.yml,custom2.json,custom3.yml

自定义配置文件的路径,指定这个参数后将不再使用默认的 _config.yml
你可以使用一个 YAMLJSON 文件的路径,也可以使用逗号分隔(无空格)的多个 YAMLJSON 文件的路径。例如:

1
2
3
4
5
# 使用 custom.yml 代替默认的 _config.yml
$ hexo server --config custom.yml

# 使用 custom.yml, custom2.json 和 custom3.yml,其中 custom3.yml 优先级最高,其次是 custom2.json
$ hexo generate --config custom.yml,custom2.json,custom3.yml

当你指定了多个配置文件以后,Hexo 会按顺序将这部分配置文件合并成一个 _multiconfig.yml。如果遇到重复的配置,排在后面的文件的配置会覆盖排在前面的文件的配置。这个原则适用于任意数量、任意深度的 YAML 和 JSON 文件。

显示草稿

1
$ hexo --draft

显示 source/_drafts 文件夹中的草稿文章。

自定义 CWD

1
$ hexo --cwd /path/to/cwd

自定义当前工作目录(Current working directory)的路径。

Win10系统:

新增:

  • 贴靠窗口:
    Win + 左/右 > Win + 上/下 > 窗口可以变为 1/4 大小放置在屏幕 4 个角落。
  • 切换窗口:
    Alt + Tab(不是新的,但任务切换界面改进)。
  • 任务视图:
    Win + Tab(松开键盘界面不会消失)。
  • 创建新的虚拟桌面:
    Win + Ctrl + D。
  • 关闭当前虚拟桌面:
    Win + Ctrl + F4。
  • 切换虚拟桌面:
    Win + Ctrl + 左/右。

常用:

  • Win键   桌面与开始菜单切换按键
  • Win + R  打开运行对话框
  • Win + Q  快速打开搜索
  • Win + I  快速打开Win10设置栏
  • Ctrl+Alt+Del  快速打开任务管理器
  • Alt+F4  关机快捷键

Windows键组合快捷键

  • Win + ←:最大化窗口到左侧的屏幕上(与开始屏幕应用无关)
  • Win + →:最大化窗口到右侧的屏幕上(与开始屏幕应用无关)1. Win+ ↑:最大化窗口(与开始屏幕应用无关)
  • Win+ ↓:最小化窗口(与开始屏幕应用无关)
  • Win+ SHIFT +↑:垂直拉伸窗口,宽度不变(与开始屏幕应用无关)
  • Win+ SHIFT +↓:垂直缩小窗口,宽度不变(与开始屏幕应用无关)
  • Win+SHIFT+←:将活动窗口移至左侧显示器 (与开始屏幕应用无关)
  • Win+SHIFT+→:将活动窗口移至右侧显示器(与开始屏幕应用无关)
  • Win+ P:演示设置
  • Win+ Home:最小化所有窗口,第二次键击恢复窗口(不恢复开始屏幕应用)
  • Win+ 数字键:打开或切换位于任务栏指定位置的程序
  • Win+Shift+数字键:打开位于任务栏指定位置程序的新实例
  • Win+B:光标移至通知区域
  • Win+Break:显示“系统属性”对话框
  • Win+D:显示桌面,第二次键击恢复桌面 (不恢复开始屏幕应用)
  • Win+E:打开我的电脑
  • Win+Ctrl+F:搜索计算机(如果你在网络上)
  • Win+G:循环切换侧边栏小工具
  • Win+L:锁住电脑或切换用户
  • Win+M:最小化所有窗口
  • Win+Shift+M:在桌面恢复所有最小化窗口(不恢复开始屏幕应用)
  • Win+R:打开“运行”对话框
  • Win+T:切换任务栏上的程序
  • Win+Alt+回车:打开Windows媒体中心
  • Win+U:打开轻松访问中心
  • Win+F1:打开Windows帮助和支持
  • Win+N:插件新笔记(OneNote)
  • Win+S:打开屏幕截图工具(OneNote)
  • Win+Q:打开Lync,Windows 8搜索功能移除了该快捷键
  • Win+A:接受所有来电 (在microsoft Lync中)
  • Win+X:拒绝来电(在microsoft Lync中),如果Windows移动中心存在,该快捷键不起作用
  • Win+减号:缩小(放大镜)
  • Win+加号:放大(放大镜)
  • Win+Esc:关闭放大镜
  • Win+空格键:切换输入语言和键盘布局
  • Win+O:禁用屏幕翻转
  • Win+,:临时查看桌面
  • Win+V:切换系统通知信息
  • Win+Shift+V:反向切换系统通知信息
  • Win+回车:打开“讲述人”
  • Win+PgUp:将开始屏幕或开始屏幕应用移至左侧显示器
  • Win+PgDown:将开始屏幕或开始屏幕应用移至右侧显示器
  • Win+Shift+.:将应用移至左侧
  • Win+.:将应用移至右侧
  • Win+C:打开Charms栏(提供设置、设备、共享和搜索等选项)
  • Win+I:打开设置栏
  • Win+K:打开连接显示屏
  • Win+H:打开共享栏
  • Win+Q:打开应用搜索面板
  • Win+W:打开“设置搜索”应用
  • Win+F:打开“文件搜索”应用
  • Win+Tab:循环切换应用
  • Win+Shift+Tab:反向循环切换应用
  • Win+Ctrl+Tab:循环切换应用,切换时手动选择应用
  • Win+Z:打开“应用栏”
  • Win+/:恢复默认输入法
  • Win+J:显示之前操作的应用
  • Win+X:快捷菜单

常规(通用)的键盘快捷方式:

  • F1 显示帮助
  • Ctrl+Shift+Esc 打开任务管理器
  • Ctrl+A 全选
  • Ctrl+C 复制选择的项目
  • Ctrl+X 剪切选择的项目
  • Ctrl+V(或 Shift+Insert) 粘贴选择的项目
  • Ctrl+Z 撤消操作
  • Ctrl+Y 重新执行某项操作
  • Delete(或 Ctrl+D) 删除所选项目并将其移动到“回收站”
  • Shift+Delete 不先将所选项目移动到“回收站”而直接将其删除
  • F2 重命名选定项目
  • Ctrl+向右键 将光标移动到下一个字词的起始处
  • Ctrl+向左键 将光标移动到上一个字词的起始处
  • Ctrl+向下键 将光标移动到下一个段落的起始处
  • Ctrl+向上键 将光标移动到上一个段落的起始处
  • Ctrl+Shift 加某个箭头键 选择一块文本
  • Shift 加任意箭头键 在窗口中或桌面上选择多个项目,或者在文档中选择文本
  • Ctrl 加任意箭头键+空格键 选择窗口中或桌面上的多个单个项目
  • Ctrl+A 选择文档或窗口中的所有项目
  • F3 搜索文件或文件夹
  • Alt+Enter 显示所选项的属性
  • Alt+F4 关闭活动项目或者退出活动程序
  • Alt+空格键 为活动窗口打开快捷方式菜单
  • Ctrl+F4 关闭活动文档(在允许同时打开多个文档的程序中)
  • Ctrl+ Alt+Tab 使用箭头键在打开的项目之间切换
  • Ctrl+鼠标滚轮 更改桌面上的图标大小
  • Win键 + Tab 使用 Aero Flip 31. D 循环切换任务栏上的程序
  • Ctrl + Win键 + Tab 通过 Aero Flip 31. D 使用箭头键循环切换任务栏上的程序
  • Alt+Esc 以项目打开的顺序循环切换项目
  • F6 在窗口中或桌面上循环切换屏幕元素
  • F4 在 Win资源管理器中显示地址栏列表
  • Shift+F10 显示选定项目的快捷菜单
  • Ctrl+Esc 打开“开始”菜单
  • Alt+加下划线的字母 显示相应的菜单
  • Alt+加下划线的字母 执行菜单命令(或其他有下划线的命令)
  • F10 激活活动程序中的菜单栏
  • 向右键 打开右侧的下一个菜单或者打开子菜单
  • 向左键 打开左侧的下一个菜单或者关闭子菜单
  • F5(或 Ctrl+R) 刷新活动窗口
  • Alt+向上键 在 Win资源管理器中查看上一级文件夹
  • Esc 取消当前任务
  • 插入 CD 时按住 Shift 阻止 CD 自动播放
  • 左 Alt+Shift 在启用多种输入语言时切换输入语言
  • Ctrl+Shift 在启用多个键盘布局时切换键盘布局
  • 右或左 Ctrl+Shift 更改从右到左阅读语言的文本阅读方向
  • Win资源管理器中的快捷键
  • Ctrl+N 打开新窗口
  • Ctrl+W 关闭当前窗口
  • Ctrl+Shift+N 新建文件夹
  • End 显示活动窗口的底端
  • Home 显示活动窗口的顶端
  • F11 最大化或最小化活动窗口
  • Ctrl+句点 顺时针旋转图片
  • Ctrl+逗号 逆时针旋转图片
  • Num Lock+数字键盘上的星号 (*) 显示所选文件夹下的所有子文件夹
  • Num Lock+数字键盘上的加号 (+) 显示所选文件夹的内容
  • Num Lock+数字键盘上的减号 (1. ) 折叠选定的文件夹
  • 向左键折叠当前选项(如果它处于展开状态),或者选择其父文件夹
  • Alt+Enter 打开所选项目的“属性”对话框
  • Alt+P 显示预览窗格
  • Alt+向左键   查看上一个文件夹
  • Backspace(退格键)向上 返回父文件夹
  • 向右键显示当前选项(如果它处于折叠状态),或者选择第一个子文件夹
  • Alt+向右键 查看下一个文件夹
  • Alt+向上键 查看父文件夹
  • Ctrl+Shift+E 显示所选文件夹上面的所有文件夹
  • Ctrl+鼠标滚轮 更改文件和文件夹图标的大小和外观
  • Alt+D 选择地址栏
  • Ctrl+E 选择搜索框
  • Ctrl+F 选择搜索框

在对话框中使用的快捷键

  • Ctrl+Tab 在选项卡上向前移动
  • Ctrl+Shift+Tab 在选项卡上向后移动
  • Tab 在选项上向前移动
  • Shift+Tab 在选项上向后移动
  • Alt+加下划线的字母 执行与该字母匹配的命令(或选择选项)
  • Enter 对于许多选定命令代替单击鼠标
  • 空格键 如果活动选项是复选框,则选中或清除该复选框
  • 箭头键 如果活动选项是一组选项按钮,则选择某个按钮
  • F1 显示帮助
  • F4 显示活动列表中的项目
  • Backspace 如果在“另存为”或“打开”对话框中选中了某个文件夹,则打开上一级文件夹

Word

Excel

PPT

题目:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例

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

方法一

代码

1
2
3
4
5
6
7
8
9
10
11
12
int singleNum(vector<int>& nums)
{
int res = 0;
for(int i = 0; i < 32; i++) {
int count = 0;
for(int j = 0; j < nums.size(); j++) {
count += (nums[j] >> i) & 1;
}
res += (count % 3) << i;
}
return res;
}

解析

  1. 首先:为什么i < 32?
    int型占4个字节,即32位,所以int的大小为 int$\in$ [$-2^{31}$, $2 ^ {31} -1$]
  2. 时间复杂度为:O(32n) <===> O(n);
  3. 虽然是二进制,但是运算法则和十进制并无差异,变的只是进制而已;
  4. 因为要确定一个数字,所以$\%3$会让那个数字显示出来在二进制形式下,那个位置有1。

方法二

代码

1
2
3
4
5
6
7
8
int singleNum(vector<int>& nums) {
int ones = 0, twos = 0;
for(auto x : nums) {
ones = (ones ^ x) & ~twos;
twos = (twos ^ x) & ~ones;
}
return ones;

解析

  1. 自动机 的角度出发;
  2. 状态机:(举例:)
状态量 ones twos
初始状态 0 0
一个1 1 0
两个1 0 1
三个1 0 0
3. 三个状态一循环,比如有6个1, 则进行两轮循环,状态量为0   0
0%