技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。
目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。
初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。
如果有任何问题可以在文章后评论或者私信给我。
我会持续分享下去,敬请您的关注。
LeetCode 217. 存在重复元素(Contains Duplicate)
问题描述:
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例:
C语言实现:
数组的值没有给定范围,也就是取值范围是整个32位整数。
所以我没有特别好的解题方法,能想到的方法有两种,一种是先对数组进行排序,然后遍历查看是否存在相邻的两个数相等的情况,如果存说明有重复的数存在,返回true,否则返回false。
第二种方法是构造一个hash表,通过查表来确定是否存在重复元素。
对于C语言来说,第一种方法实现起来比较简单,算法复杂度是O(nlogn),可以接受。
代码如下:
python语言的实现:
对于python来说,我们可以将通过nums生成一个集合,这是一个去重的操作,然后比较集合的长度是否和原列表的长度相等,如果相等说明没有重复的元素,否则说明有重复的元素。
代码如下:
Java语言的实现:
Java的实现我们用的是方法二来实现的,即构造一个哈希表,通过查表来确定是否存在重复的元素。
代码如下:
最后这道题我发现两个问题:
第一:
Test cases的覆盖率很低,低到类似[3,2,3,1]这样的case都没有。导致一些明显是错误的代码也通过了。比如下面这个:
第二:
抄袭现象很明显。上面这个错误的代码居然多次看到,说明很多人想都没想就复制黏贴了,有的只是稍微的格式化了一下。
如果刷题就是简单的抄袭,而不是去试图理解,那么刷题就变得一点意义都没有,就算面试面到了这道题,你依然不会。