## 60天带你刷完Leetcode【第6天】626-617

**作者：学酥**

### 题目 626

如下面的表，问如何将相邻两行的人名字调换得到sample out

|     |     |     |
| --- | --- | --- |
| +---------+---------+<br>\|    id   \| student \|<br>+---------+---------+<br>\|    1    \| Abbot   \|<br>\|    2    \| Doris   \|<br>\|    3    \| Emerson \|<br>\|    4    \| Green   \|<br>\|    5    \| Jeames  \|<br>+---------+---------+ |
| >>>>> | +---------+---------+<br>\|    id   \| student \|<br>+---------+---------+<br>\|    1    \| Doris   \|<br>\|    2    \| Abbot   \|<br>\|    3    \| Green   \|<br>\|    4    \| Emerson \|<br>\|    5    \| Jeames  \|<br>+---------+---------+ |

**题解**：SQL语句不能loop每一行数据并keep上一个iteration的值，只能对某一行做处理。因此这个题要instead改变id而不是改变student的名字，而id可根据奇偶来做+1或-1处理。

### 题目 625

找到一些特定数中的最小数，这些数每一位digit的乘积等于给定的一个整数a。比如238和443和68的每一位digit的乘积都等于48，其中68最小。

**题解**：实际上这道题问的是找到给定数的个位数factor的最小排列。可以从大到小找到能整除给定数的个位数factor（从9到0），并将找到的factor从低位到高位的组成答案。

### 题目 624

有m个sorted array，从任意两个不同的array中各取一个数，求取出数值差的最大绝对值。

**题解**：由于每个候选的array都是sorted的，可以在loop每个array的过程中keep一个到当前array之前的最小数和最大数，将这些最小数和最大数与当前的array的最大值和最小值做差并从中选取global的最大差值。

### 题目 623

要求在binary tree的某一层d加入value为k的node，每个在那一层的node下面加两个。

**题解**：可以常规的level order到第d层，然后停止并做相应的添加node操作。也可以做dfs，记录当前recursion对应的层数，到第d层添加node并返回。

### 题目 621

给一个task list，要求设计task scheduler。每个task用一个字母代表，在list里每出现一次代表运行需要一个单位的时间。比如\['A','A','A','B','B','B'\]表示需要运行task A三个单位时间，task B三个时间。还有一个input是cool down的时间n，规定同一个task运行一个时间点后必须相隔一定时间再运行一个时间点。比如n=2则运行一个task两个时间点后必须运行其他task或idle。求最少的运行完所有task所需的单位时间。

**题解**：理解题目后，发现没有idle的最短运行时间要么是task的个数，要么有idle的话为最耗时task运行所需要的时间，其余的task的执行可以安排在运行最耗时task方案的idle的位置上。可以通过计算最耗时task运行所需要的时间为(最耗时task所需时间-1)\*(n+1)+最耗时task的种数，来完成任务。

### 题目 618

按照题意将对table做pivot(转换成另一张表)。这里是把其中一列每一个值单独做成一列

|     |     |     |
| --- | --- | --- |
| \| name   \| continent \|<br>\|---------\|-------------\|<br>\| Jack    \| America   \|<br>\| Pascal \| Europe   \|<br>\| Xi         \| Asia         \|<br>\| Jane    \| America   \| |
| >>>>> | \| America \| Asia \| Europe \|<br>\|-----------\|------\|----------\|<br>\|    Jack   \| Xi    \| Pascal   \|<br>\|<br>    Jane    \|        \| <br>             \| |

**题解**：先思考新的表要如何得到。比较straightforward的做法是从原表中分别找出每一列，再想办法合并；在mysql中可以通过user-defined variable实现，而在select的时候加上case-when/ if-else就可以使value为null。再group by idx即可合并idx相同的行而得到所需要的结果。

### 题目 617

合并两个binary tree，规则是新binary tree的node value为两个旧的tree在对应位置的node的sum。

**题解**：traverse两棵树，在每一个recursion构建新的node并按照规则设定value的值，将左右child设置为对旧的tree左右child做recursion的返回值。
