反转两次的数字
1 | 反转 一个整数意味着倒置它的所有位。 |
1 | 输入:num = 526 |
1 | 输入:num = 1800 |
1 | 输入:num = 0 |
这道题分两种情况,最后一位是0和最后一位不是0。
如果最后一位是不是0,直接返回True
如果最后一位是0,分这个数是0还是其他数字。如果这个数是0,直接回返True,如果这个数不是0,直接返回False
1 | class Solution(object): |
执行所有后缀指令
1 | 现有一个 n x n 大小的网格,左上角单元格坐标 (0, 0) ,右下角单元格坐标 (n - 1, n - 1) 。给你整数 n 和一个整数数组 startPos ,其中 startPos = [startrow, startcol] 表示机器人最开始在坐标为 (startrow, startcol) 的单元格上。 |
1 | 输入:n = 3, startPos = [0,1], s = "RRDDLU" |
1 | 输入:n = 2, startPos = [1,1], s = "LURD" |
1 | 输入:n = 1, startPos = [0,0], s = "LRUD" |
这道题,拿到手,我就直接上if else
。分别对上下左右进行边界判断,如果字符串最终走完了,那么说明该字符串的指令都可以执行,如果执行到一半退出了,那么说明越界了。
1 | class Solution(object): |
做第三题之前,我们先来做一下Leetcode
1685题,第三题和这道题类似。
有序数组中差绝对值之和
1 | 给你一个 非递减 有序整数数组 nums 。 |
1 | 输入:nums = [2,3,5] |
1 | 输入:nums = [1,4,6,8,10] |
初看这道题,我眼前一亮,一上来就是一个双重循环。多么美妙的手法啊!写完之后,执行代码没有问题,点击提交,多么优雅!过了三秒,如下图所示,我知道我大意了。
思索数分钟后,我点击了相关标签
这个选项,试图寻找一丝灵感。相关标签里写到了三个大字,前缀和。我恍然大悟。接下来,我将通过如下的思路来进行分析。
1 | 解题思路: |
如果你看懂了上面的分析过程,那么代码写起来将会非常容易。
1 | class Solution(object): |
现在让我们回到本周周赛的第三题
相同元素的间隔之和
1 | 给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 |
1 | 输入:arr = [2,1,3,1,2,3,3] |
1 | 输入:arr = [10,5,10,10] |
现在再看这道题,多么熟悉!由于我之前并没有做过1685这道题,所以我早上比赛的时候一脸懵逼,但是还是硬着头皮写了一下。我先讲一下我没有做1685这道题之前做这个题的思路。
- 首先我肯定需要分组,按照相同的数字将他们的下标分在一组。
- 其次针对每一组数我都需要计算他们各自和组里其他数的绝对值之和。
于是我写了如下代码,其中我通过字典的key来保存数字,value来保存数字的下标。之后对字典的value进行遍历,去计算组内每个数和其他数之间的绝对值之和。
1 | class Solution(object): |
最终还是超时了。。。。。
当我做了1685这道题之后,我明白了我需要改进的地方。对于字典分组这一块还是不需要改变的,只需要改进后面计算绝对值之和。改进后的代码如下
1 | class Solution(object): |
最终还是超时了。。。。。
我突然感觉眼前一片黑暗,这特么也能超时???于是我打算优化一下前面字典分组这一块,优化代码如下
1 | class Solution(object): |
梅开三度,还是超时。。。于是我看了一下题解是怎么写的。其中有一个python
的解法跟我这个差不太多,我借用了一下人家对于字典分组这块的写法,最终代码如下
1 | class Solution(object): |
终于通过了😭😭😭,特么的,同样都是字典,为啥原生的字典和collections
模块中的字典差距就这么大呢。。。
还原原数组
1 | Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成。她会选择一个任意的 正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 higher : |
1 | 输入:nums = [2,10,6,4,8,12] |
1 | 输入:nums = [1,1,3,3] |
1 | 输入:nums = [5,435] |
这道题嘛!告辞。。。