22. 只出现一次的数字 III
题目
解析
- 所有元素只有两个出现一次,其余的出现两次,那么对所有的元素求异或和,那么最后求出来的肯定是
出现过一次元素的异或和 - 接着,因为这两个元素不同,所以,这两个数字的异或和肯定有一位为1,假设第k位为1
- 那么将第k位为1的分为一堆,其余的分为另一堆
- 接下来的问题就是
列表中只有一个出现一次的数字,其余的出现两次这个问题了
【释】:这两堆肯定是第k位为1的为一堆,该堆中只有一个出现过一次,其余的数出现两次,最后,对这两堆分别求异或和就可以求出来了
代码1
1 | vector<int> singleNumber(vector<int>& nums) { |
代码2
1 | vector<int> singleNumber(vector<int>& nums) { |
【释】:因为 $s_1$ ^ $s_2$ = s,那么 s ^ $s_1$ = $s_2$,具体性质详见 位运算的知识点以及常用技巧
20. Hexo指令
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-cli 将 page 视为指定文章的标题、并采用默认的 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 | # 使用 custom.yml 代替默认的 _config.yml |
自定义配置文件的路径,指定这个参数后将不再使用默认的 _config.yml。
你可以使用一个 YAML 或 JSON 文件的路径,也可以使用逗号分隔(无空格)的多个 YAML 或 JSON 文件的路径。例如:
1 | # 使用 custom.yml 代替默认的 _config.yml |
当你指定了多个配置文件以后,Hexo 会按顺序将这部分配置文件合并成一个 _multiconfig.yml。如果遇到重复的配置,排在后面的文件的配置会覆盖排在前面的文件的配置。这个原则适用于任意数量、任意深度的 YAML 和 JSON 文件。
显示草稿
1 | $ hexo --draft |
显示 source/_drafts 文件夹中的草稿文章。
自定义 CWD
1 | $ hexo --cwd /path/to/cwd |
自定义当前工作目录(Current working directory)的路径。
16. 电脑常用快捷键
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
15. 只出现一次的数字 II
题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例
1 | 输入: [2,2,3,2] |
方法一
代码
1 | int singleNum(vector<int>& nums) |
解析
- 首先:为什么
i < 32?
int型占4个字节,即32位,所以int的大小为 int$\in$ [$-2^{31}$, $2 ^ {31} -1$] - 时间复杂度为:O(32n)
<===>O(n); - 虽然是二进制,但是运算法则和十进制并无差异,变的只是进制而已;
- 因为要确定一个数字,所以$
\%3$会让那个数字显示出来在二进制形式下,那个位置有1。
方法二
代码
1 | int singleNum(vector<int>& nums) { |
解析
- 从
自动机的角度出发; - 状态机:(举例:)
| 状态量 | ones | twos |
|---|---|---|
| 初始状态 | 0 | 0 |
| 一个1 | 1 | 0 |
| 两个1 | 0 | 1 |
| 三个1 | 0 | 0 |
| 3. 三个状态一循环,比如有6个1, 则进行两轮循环,状态量为0 0 |
14. Office各版本下载
包括:在线版本和离线版本
13. unordered_map(哈希表)
unordered_map是C++中的哈希表,可以在任意类型与类型之间做映射。
4. 程序设计比赛-常用技巧
无穷大
0x3f3f3f3f
freopen()
头文件
stdio.h或者cstdio(如果是C11,iostream似乎已经包含了,若是C98需要加上#include <cstdio>)
声明
1
FILE *freopen(const char *filename, const char *mode, FILE *stream)
参数
- filename -- 文件名,用于存储输入输出的自定义文件名。
- mode -- 文件打开的模式。和fopen中的模式(如: `r` -- "只读访问"、`w` -- "只写访问"、`a` -- "追加写入")相同。
- stream -- 一个文件,通常使用标准流文件。如:`stdin` -- 标准输入、`stdout` -- 标准输出、`stderr`(一般不用) -- 标准错误
- 模式
- 功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。
- 实例
stdout到一个文本文件的重定向,即:把输出到屏幕的文本输出到一个文本文件中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
if(freopen("./output.txt","r",stdout)==NULL)
fprintf(stderr,"error redirecting stdout\n");
for(int i=0;i<10;i++)
printf("%3d",i);
printf("\n");
fclose(stdout);
return 0;
}从文件
in.txt中读入数据,打印到屏幕上1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b;
freopen("./in.txt", "r", stdin);
// freopen("out.txt", "a", stdout);
while (cin >> a >> b)
cout << a + b << endl;
fclose(stdin);
fclose(stdout);
return 0;
}从文件
in.txt中读入数据,计算加和输出到out.txt中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b;
freopen("./in.txt", "r", stdin);
freopen("out.txt", "a", stdout);
while (cin >> a >> b)
cout << a + b << endl;
fclose(stdin);
fclose(stdout);
return 0;
}
> Note: 一般常用的是 `6.2`,因为有些比赛的命令行不能粘贴,一个个的打又太麻烦了,这样就会方便很多
导入全部头文件
1 | #include <bits/stdc++.h> |
3. 由数据范围反推算法复杂度以及算法内容
友情提示
一般ACM或者笔试题的时间限制是1秒或2秒。
在这种情况下,C++代码中的操作次数控制在 $10^7$ 为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
- n ≤ 30 => 指数级别, dfs+剪枝,状态压缩dp
- n ≤ 100 => O(n3)O(n3),floyd,dp
- n ≤ 1000 => O(n2)O(n2),O(n2logn)O(n2logn),dp,二分
- n ≤ 10000 => O(n∗n√)O(n∗n),块状链表
- n ≤ 100000 => O(nlogn)O(nlogn) => 各种sort,线段树、树状数组、set/map、heap、dijkstra+heap、spfa、求凸包、求半平面交、二分
- n ≤ 1000000 => O(n)O(n), 以及常数较小的 O(nlogn)O(nlogn) 算法 => hash、双指针扫描、kmp、AC自动机,常数比较小的 O(nlogn)O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa
- n ≤ 10000000 => O(n)O(n),双指针扫描、kmp、AC自动机、线性筛素数
- n ≤ $10^9$ => O(n√)O(n),判断质数
- n ≤ $ 10^{18} $ => O(logn)O(logn),最大公约数