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

作者:学酥

题目 626

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

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

题解: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 |
|---------|-------------|
| Jack    | America   |
| Pascal | Europe   |
| Xi         | Asia         |
| Jane    | America   |
>>>>> | America | Asia | Europe |
|-----------|------|----------|
|    Jack   | Xi    | Pascal   |
|
   Jane    |        |
             |

题解:先思考新的表要如何得到。比较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的返回值。