不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

Leetcode-217-contains-duplicate | 存在重复元素

题目链接

leetcode中国
leetcode

思路

先考虑到特殊情况,nums数组元素为0和1,直接返回false
设置计数变量count,将第一次遍历数组得到的元素与第二次遍历数组得到的元素做判断,如果两数相等,就将count加1,在结束循环后对count做判断,count值不等于0返回true,否则返回false

这里尤其需要注意,第一次遍历数组的下标一定比第二次遍历出的数组元素下标大,举个例子:
输入[1,2,3,1],判断这个数组里有没有重复元素,第一次遍历nums[0]得到1,那么第二次遍历时肯定不能从nums[0]开始,必须从nums[1]开始往后累加,不然在同一个数组中,将下标相等的两个元素做比较,肯定相等,从而AC不通过。

解决

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func containsDuplicate(nums []int) bool {
if len(nums) == 0 || len(nums) == 1 {
//考虑nums特殊情况
return false
}

count := 0
for i:=0;i<len(nums);i++ {
for j := i+1;j<len(nums);j++ {
if nums[i] == nums[j] {
count++
}
}
}

if count != 0 {
return true
} else {
return false
}
}

附录,踩坑记录

第一版

创建一个shift数组,第一步先遍历nums数组,将每次遍历取出的numshift数组里的值做判断,如果相等就代表重复,count增1,最后在循环结束后,对count做判断,如果不等于1,返回true,否则返回false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//第一版
func containsDuplicate(nums []int) bool {
var shift []int
count := 0
for _,num := range nums {
if len(shift) == 0 {
shift = append(shift,num)
} else {
for _,s := range shift {
if s == num {
count++
}
}
shift = append(shift,num)
}
}

if count != 1 && count != 0 {
return true
} else {
return false
}
}

第一版存在的问题

  • 为什么要复制数组,直接用原来的nums数组做range不可以吗?
  • append数组有问题
  • 没有考虑nums数组元素为1和0两种特殊情况
  • 判断条件只需满足count != 0即可
------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!