力扣217 存在重复元素

先放一个暴力双循环超时了的Java代码,有一些需要注意的点

class Solution {
    public boolean containsDuplicate(int[] nums) {
        int y=0;
        int z=0;
        if(nums.length==1) return false;
        for(y=0;y<nums.length;y++){
            int val=nums[y];
            
            for(z=y+1;z<nums.length;z++){
                if(val==nums[z]){
                    return true;
                }
            }             
        }    
        return false;  
}   
    }

第一个是z=y+1,可以避免“我等于我自己”带来的尴尬。第二个是出现error: missing return statement,【大致是你申明了返回类型的方法,没有确保有返回值。比如你在分支判断时,有些分支有返回值,有些分支没有返回值。或则你把返回指令写在了循环内,那么如果这个循环结构一次都不循环,也属于没有返回值】。

下面是使用集合的Java代码

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> sett = new HashSet<Integer>();
        for(int i:nums)
            sett.add(i);
        return sett.size()<nums.length?true:false;
    }
}

还有一种方法,对于这种不看顺序只看大小的数组,可以手动给它排个序,然后就好处理多了

Arrays.sort(nums);

还还有一种方法,用哈希表

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> sett = new HashSet<Integer>();
        for (int x : nums) {
            if (!sett.add(x)) {  
                return true;  //哈希表里插不进去新的键值对就返回true
            }
        }
        return false;
    }
}

下面是Python代码

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        sett = set(nums)
        if len(sett) == len(nums):
            return False
        else:
            return True
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        dic = {}
        if len(nums) == 0:
            return False
        for i in nums:
            if i in dic:
                return True # 注意这个顺序
            dic[i] = 1
        return False

先判断有没有key值重复,再把i设为key,1设为value。否则会报错。

注意True和False在Python中很严格要求首字母大写。

经验分享 程序员 微信小程序 职场和发展