【Fifty Project - D30】
昨天的一个雷把网劈没了,写的稿子也全没了!!!气死我了。今天补一波。
今日完成记录
Time | Plan | 完成情况 |
---|---|---|
7:30 - 9:00 | 毕业材料准备 | √ |
13:30 - 15:00 | 健身 | √ |
15:00 - 17:00 | Leetcode | √ |
20:00 - 21:00 | 羽毛球 | √ |
健身
练肩日
哑铃推肩 30磅 * 12 * 4
侧平举 10磅 * 12 * 2 + 20磅 * 12 * 2
Y举 2.5kg * 12 * 2 + 5kg * 12 * 2
实力推 30kg * 12 * 4
悬垂举腿 12 次 * 2
悬垂举腿进步大大的,现在已经可以比较稳地举腿了!
Leetcode
堆题单 - 贪心、构造、重构
不含AAA或者BBB的字符串:给两个数字,一个a, 一个b,要求构造一个字符串,长度为a + b,其中包含a个’a’和b个’b’,但是不能出现’aaa’和’bbb’。
思路:这个题单的贪心预热题目,首先判断一下a多还是b多,从多的字符开始构造,只要a和b数量不一样,那么每次就将数量多的那个字符放2个,数量少的字符放一个,每次操作后差值减1,等到两者数量一致,就直接拼’ab’直到构造完成。(题目保证有解,有解的判断条件是多的那个字符数不能大于少的那个的两倍+2)
补一个题,最长快乐字符串:这个题是不能有aaa,bbb,ccc,然后构建字符串要尽可能地长,和上面这个基本一致,就是判断的时候判断当前最多字符是否和前两个都一样,一样就用次多字符填充。
重构字符串:给一个字符串,要求返回一个重构字符串使其任意相邻字符都不相同。题目保证有解。
思路:同样的题目保证了有解,但是还是分析一下有解和无解的情况,这个题和上一题思路差不多,上一题可以就是任意三个相邻字符不能相同。这一题是任意两个相邻字符不相同,考虑什么时候无解,其实就是至少有几个相同字符出现的情况下,无法构造成功,答案是ceiling(n / 2) + 1,也就是如果某个字符出现次数超过了celing(n / 2),那么无解。假设一共九个字符,那么当相同字符有9 / 2 上取整等于5个的时候,我们可以选取下标0,2,4,6,8放入该字符,此时所有偶数位都已经放满了,再多放一个就会不符合要求。
接下来讨论一下该如何去构造,实际上从刚刚这个案例分析可以找到点思路,我们先填充所有偶数下标位置,再填充奇数下标位置。按照出现频次进行填充,也就是先把出现次数最多的字符按照上述顺序填充,如原字符串"aaaabbbcc",那么我们就按照下标顺序为"024681357"依次放置四个a、3个b、2个c。得到构造后的字符串是"abababacb"。
解释完构造方法,我们需要证明一下这个方法的合理性,也就是如何确保这种方法构造出来的必然是相邻不同的。由于先填充偶数下标再填充奇数下标,如果出现相邻字符相同,那么这个字符填入的所有下标必然是从偶数下标开始到奇数下标结束,如2,4,6,8,1,出现了1和2的相邻相同,从一个偶数下标开始到出现第一个相邻奇数下标,它的长度恰好是ceiling(n/2),而这个字符在所有数中出现频次是最高的(从刚刚的有解情况可知),因此这个字符的开始下标只能是0(因为我们按照频次填充字符),所以这个字符对应的下标只能是0,2,4,6,8。不可能出现相邻相同。
距离相等的条形码:给一个数组,要求重排数组使得数组相邻都不等。
思路:跟上面一题差不多,范围大了一点,数组的数是1-10000,别的没差,也是偶数下标构造,然后奇数下标构造。
你可以工作的最大周数:给一个工作数组,表示每个工作的阶段数,每一周里你可以选择一个工作推进一个阶段,但是不能连续两周干同一个工作,问最大能工作多少周
思路:这个题直接用上面AAA的思路构造也可以得解,并且能给出具体方案,但是数据规模太大了,会T,这个数组大小是1e5,每个数大小是1e9。所以过不了。刚刚的思路是构造出具体方案,而本题是直接给出最大工作周数,也就是这个构造方案的长度。这个问题其实和刚刚的有无解很像,有解的条件是最高频次小于等于ceiling(n / 2),也就是说,只要所有频次中最大频次是小于等于ceiling(n / 2)那么就可以构造一个长度为n的解。所以这个题遍历所有数,统计频次,取数组总长和最大频次*2+1的较小者得解。