Seven's blog

你不会找到路,除非你敢于迷路

0%

ARTS-15

Algorithm

283. 移动零

解法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public void moveZeroes(int[] nums) {
int loopTimes = nums.length, zeroCount = 0, insertIndex = 0;
for (int scanIndex = 0; scanIndex < loopTimes; scanIndex++) {
if (nums[scanIndex] != 0) {
nums[insertIndex++] = nums[scanIndex];
} else {
zeroCount++;
}
}

for (int i = nums.length - 1; zeroCount > 0; zeroCount--, i--) {
nums[i] = 0;
}
}
}

执行用时:0ms,内存消耗:37.7MB。

解法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public void moveZeroes(int[] nums) {
for (int scanIndex = 0, insertIndex = 0; scanIndex < nums.length; scanIndex++) {
if (0 != nums[scanIndex]) {
nums[insertIndex] = nums[scanIndex];
if (scanIndex != insertIndex) {
nums[scanIndex] = 0;
}

insertIndex++;
}
}
}
}

执行用时:0ms,内存消耗:36.6MB。

Review

10 Signs You Will Suck at Programming

文章论述了 10 个影响编程的品格。想要入门的人可以自查自己适不适合编程,已经入行的人可以看看自己有哪些地方需要改进。

  1. 缺乏好奇心
  2. 缺乏自己解决问题的能力(或资源检索能力)
  3. 面对问题时缺乏耐心
  4. 攻克问题时没有成功的喜悦
  5. 对学习和理解不耐烦
  6. 厌倦思考
  7. 无法独立思考
  8. 思维僵硬、狭窄或者混乱
  9. 需要“正确”答案,而不是从一系列答案中甄别好坏
  10. 不注意细节

Tip

MySQL 选错索引

MySQL 通过优化器来制定执行方案,优化器会结合扫描行数、是否使用临时表、是否排序等各种因素综合判断使用哪一个索引进行查询。

扫描行数判断:MySQL 在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,只能通过统计信息来估算记录数,这个统计信息就是索引的“区分度”。一个索引上不同的值越多,这个索引的区分度就越好。而这个索引上不同值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好。但是 MySQL 是通过采样统计的方法来估算索引基数的,所以基数的估计很容易是不准的。

对此,可以通过 analyze table 命令来重新统计索引信息。

但是优化器的判断标准不止是扫描行数,是否使用临时表、是否排序等因素也会影响索引的选择。

索引选择异常的处理

  • 采用 force index 强行选择一个索引;
  • 考虑修改语句,引导 MySQL 使用我们期望的索引;
  • 有写场景下,我们可以新建一个更合适的索引,来提供给优化器选择。或者删掉误用的索引。

Share

过年回家,看到的一些变化:

微信公众号
扫码关注, 一起进步!