leetcode掉坑经历分享

首先要承认一点,leetcode用来刷算法题,确实是提高解题思路,扩展视野的一个好东西。但是对于leetcode上题目的概述,有些情况实在不敢苟同。

以下是几道算法刷题时,万万没想到的坑,分享给大家希望看过的人不会再掉进去。

【leetcode 49 Group Anagrams】

Given an array of strings, group anagrams together.

Example:

Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Note:

  • All inputs will be in lowercase.
  • The order of your output does not matter.

 读完题目,第一想法就是把给出的字符串进行分类,字母相同顺序不同的分成一组。但是再想想,感觉leecode不会这么白痴的给出这么明显的题,而且还是中等级难度的。所以猜测一下可能对于性能或是其他思路上有什么隐含的要求。

顺着这个思路来想,给出的例子都是三个字母的单词,且字母不会被重复使用,那么是不是隐含着对字符串去重的操作?如果bat和bat是一组的话,那么bate算不算是和他们一组?带着这些疑问,尝试着对进行解题,但是解着解着,感觉又把自己陷进一个越来越深的死胡同里出不来了。所以从讨论的答案里看看大家是怎么把这题解出来的。

看到答案的我大吃一惊,感觉自己想的那么多都是矫枉过正的想法,答案中只要求对字符串进行toCharArray后再排序,判断排序后的字符串是否被记录过,再把原字符串放到对应的集合中。什么去重,什么是否包含得情况完全没有考虑。

参考答案如下

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) return new ArrayList<List<String>>();
        Map<String, List<String>> maps = new HashMap<>();
        for (String s : strs) {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String key = String.valueOf(chars);
            if (!maps.containsKey(key)) {
                maps.put(key, new ArrayList<>());
            }
            maps.get(key).add(s);
        }
        return new ArrayList<>(maps.values());
    }
}

吐血之后,决心再刷一题平复一下心情。但是刷完下一题之后真心再次被搞吐血# #!

【leetcode 50 Pow(x, n)】

Implement pow(xn), which calculates x raised to the power n (xn).

Example 1:

Input: 2.00000, 10
Output: 1024.00000

Example 2:

Input: 2.10000, 3
Output: 9.26100

Example 3:

Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Note:

  • -100.0 < x < 100.0
  • n is a 32-bit signed integer, within the range [−231, 231 − 1]

题目看起来比上一道清晰一些,就是要计算一个数的n次方,以double类型表示出来。

但是我不甘心,还是在想这中间有没有什么隐含的条件。想来想去,感觉output的结果都是保留5位小数,这是不是要对结果做格式化处理?note中有提示n的取值范围,那是不是double类型放不下,需要使用Bigdecimal的大数据类型进行处理?

带着这些疑问,把代码写好提交,结果返回耗时超时,顿时吐血!!!!

再次翻看讨论中的答案进行思路确认,更是崩溃至极!!!排名第一的答案只要求对double类型的值进行递归相乘,达到n次方运算的效果,其他的条件完全都没有任何考虑。真心无语。

参考答案如下

public class Solution {
    public double myPow(double x, int n) {
        if(n == 0) return 1.;
        double res = myPow(x, n / 2);
        return n % 2 == 0 ? res * res : n < 0 ? res * res * (1 / x) : res * res * x;
    }
}

 所以总结leetcode刷题经验,还是要认准算法的题眼,清楚地理解每一道题的本质思路是要做什么。旁路或者点缀的逻辑不要画蛇添足的加上去。

以上是leetcode掉坑的经历分享,希望看到的同学引以为戒,不要在掉到相同的坑中~

发布了83 篇原创文章 · 获赞 58 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qixinbruce/article/details/104442621
今日推荐