(笔试题)如何判断数组中是否存在重复元素

题目:

假设数组a有n个元素,元素的取值范围为1~n,如何判定数组是否存在重复元素?

思路:

方法1:

数组排序,比较相邻元素是否相等;

时间复杂度:O(nlogn),空间复杂度:O(1)

方法2:

使用bitmap(位图),定义长度为N/8的char数组,每个bit表示对应数字是否出现过。遍历数组,使用bitmap对数字是否出现过进行统计。

时间复杂度:O(n),空间复杂度:O(n)

方法3:

遍历数组,假设第i个位置的数字为j,则通过交换将j换到下标为j的位置上,直到所有数字都出现在自己对应的下表处,或发生了冲突。

时间复杂度:O(n),空间复杂度:O(1)

代码:

方法1:

int cmp(const void* a,const void* b){
    return (*(int*)a-*(int*)b);
}

// sort and compare
bool findDuplicate(int* a,int n){
    if(a==NULL || n<=1)
        return false;

    qsort(a,n,sizeof(int),cmp);
    for(int i=0;i<n;i++){
        if(a[i+1]>a[i])
            return true;
    }
    return false;
}

方法2:

// changed to the right position
bool findDuplicate_1(int* a,int n){
    if(a==NULL || n<=1)
        return false;

    for(int i=0;i<n;i++){
        int tmp=a[i];
        if(tmp-1==i)
            continue;
        if(tmp==a[tmp-1])
            return true;
        a[i]=a[tmp-1];
        a[tmp-1]=tmp;
        i--;
    }

    return false;
}
时间: 2024-11-05 04:27:01

(笔试题)如何判断数组中是否存在重复元素的相关文章

哈希(6) - 判断数组中是否存在重复元素且距离在K之内

给定一个包含多个重复元素的未排序的数组.另外给定一个数字k,且k小于数组大小.判断数组中是否包含重复元素,且它们相隔的距离处于范围k之内. 例如: Input: k = 3, arr[] = {1, 2, 3, 4, 1, 2, 3, 4} Output: false 所有重复元素的距离>k. Input: k = 3, arr[] = {1, 2, 3, 1, 4, 5} Output: true 存在重复元素1,且距离为3(==k). Input: k = 3, arr[] = {1, 2,

JS判断数组中是否有重复元素的方法

判断数组中是否有重复元素,最容易想到的方法是使用2重循环,逐个遍历,比较,但是这个是最慢,最笨的方法,百度得出了更好的方法. var ary = new Array("111","22","33","111"); var nary=ary.sort(); for(var i=0;i<ary.length;i++){ if (nary[i]==nary[i+1]){ alert("数组重复内容:"+na

js判断数组中是否有重复元素

方法一:indexOf 方法 function isRepeat() { var ary = new Array("111", "22","22", "33", "111"); for (var i = 0; i < ary.length; i++) { console.log(ary.indexOf(ary[i])); if(ary.indexOf(ary[i]) != i) { alert(&qu

算法--判断数组中是否有重复值

判断数组中是否有重复值 第14节 重复值判断练习题 请设计一个高效算法,判断数组中是否有重复值.必须保证额外空间复杂度为O(1). 给定一个int数组A及它的大小n,请返回它是否有重复值. 测试样例: [1,2,3,4,5,5,6],7 返回:true Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class Checker { 4 public boolean checkDuplicate(int[] a, int n) {

判断数组中是否存在重复的发票号码

// 判断数组中是否存在重复的发票号码 for(int i = 0; i< invoiceNoList.size(); i++){ for(int j = i+1; j<invoiceNoList.size(); j++){ if(invoiceNoList.get(i).equals(invoiceNoList.get(j))){ // 数据校验不通过 // AssertUtils.isTrue(false, String.format("存在重复的发票号码%s;", i

LeetCode:Contains Duplicate - 判断数组内是否有重复元素

1.题目名称 Contains Duplicate(判断数组内是否有重复元素) 2.题目地址 https://leetcode.com/problems/contains-duplicate/ 3.题目内容 英文:Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in

LeetCode:Contains Duplicate II - 判断数组内是否有重复元素2

1.题目名称 Contains Duplicate II(判断数组内是否有重复元素2) 2.题目地址 https://leetcode.com/problems/contains-duplicate-ii/ 3.题目内容 英文:Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nu

JS数组常用函数以及查找数组中是否有重复元素的三种常用方法

阅读目录: DS01:常用的查找数组中是否有重复元素的三种方法 DS02:常用的JS函数集锦 DS01.常用的查找数组中是否有重复元素的三种方法 1. 1 var ary = new Array("111","22","33","111"); 2 var s = ary.join(",")+","; 3 for(var i=0;i<ary.length;i++) { 4 if(s.

找出数组中唯一的重复元素

[问题] 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> /*根据异或法的计算方式,每两个相异的数执行异或运算之后,结果为1: 每两个相同的数异或之后,结果为0,任何数与0异或,结果仍为自身. 所以数组a[N]