0%

题目



解析

  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. 所有元素只有两个出现一次,其余的出现两次,那么对所有的元素求异或和,那么最后求出来的肯定是出现过一次元素的异或和
  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$,具体性质详见 位运算的知识点以及常用技巧

题目描述

解析

  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. 发现一个好的VPN这是很重要的,我这里有一个不错的:潮音VPN,点击这里【注意:不要用Chrome浏览器,建议Microsoft Edge】即可注册;

    下面是如何配置(以win10为例,其余的上面有教程)

  2. 下载ShadowSocksr

    1. 第一步:在左面选择用户中心
    2. 第二步:点击点我下载,如下图所示:
  3. 解压到任意磁盘,如下图所示:

  4. 发送到桌面快捷方式:

  5. 打开软件

  6. 复制订阅地址:

  7. 右键任务栏小飞机,选择:SSR服务器订阅设置,如下图所示:

  8. 先点击add,再把网址换成第7步复制的订阅地址,如图:

  9. 然后,再点 add, 删除刚才无用的那个,如图所示:

    最后再点击确定

  10. 步骤7,选择 更新SSR服务器订阅(不通过代理)

  11. 选择服务器-潮音vpn-VIP专线2佛山(例子)

  12. 代理规则选“绕过局域网和大陆”

  13. ok,一切就绪,可以翻墙了!!!!

1. 生成 .exe可执行文件:

输入代码

g++ -o <demo1> <demo2>.cpp

其中:

  1. demo1、demo2是可变的
  2. demo1为:生成.exe的文件名
  3. demo2为:.cpp的C++源代码文件名

2. 运行:

输入代码

.\<file1>\<file2>\……\<demo1>

其中:

  1. file1、file2、…… 为: 该目录下的子文件夹,而demo1.exe位于这些子文件中

1:

  1. 腾讯电脑管家
  2. Chrome
  3. 翻墙VPN
  4. WinRAR
  5. office2016/office2010
  6. teamviewer
  7. 腾讯QQ
  8. 微信
  9. 亿图图示
  10. 软件删除
  11. 冰点文库
  12. QQ音乐
  13. mathtype
  14. PanDownload
  15. 迅捷编辑器
  16. 迅捷转换器

个人:

  1. Notepad++
  2. vscode
  3. Anaconda
  4. codeblocks
  5. DevC++
  6. Github
  7. Git Bash
  8. Eclipse
  9. MATLAB
  10. 网易云音乐
  11. 网易有道词典