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的返回值。