求连续数组中唯一重复的元素

1. 问题描述

  数组a[n],1到n-1这n-1个数放在这个数组中,其中有一个数重复一次。写一个算法找出这个数来。


2. 方法与思路

2.1 累加和法

  采用数学求和的方法,由于数组中只有一个数是重复的,且又是连续的,根据累加和原理,对数组求和然后减去1到n-1的和即为所求的重复数。

  

int OnlyRepeat_Sum(int a[],int len)
{
    int i,re = 0;

    for(i = 0; i < len - 1; i++)
    {
        re += a[i] - (i+1);
    }

    re += a[len-1];

    return re;
}

2.2 异或法

  根据异或公式:a^b = 1; a ^a = 0;0^a = 0。 数组a[n]中n个数异或的结果再与1到n-1异或的结果异或即为所求的重复数。说明:设重复数为a,其余n-2个数异或结果为b,n个数的异或结果为a^a^b,1到n-1的异或结果为a^b,则(a^b)^(a^a^b) = a。

  

int OnlyRepeat_xor(int a[], int len)
{
    int i,re = 0;

    for(i = 0; i < len; i++)
        re ^= a[i];

    for(i = 1; i < len; i++)
        re ^= i;

    return re;
}

2.3 位图法

  先设一个标记数组mark,长度为n,然后将这个数组的全部元素置为0。循环遍历数组a,判断mark[a[i]]是否为1,若是则返回这个重复的元素,否则将mark[a[i]]标记为1。

  

//数组元素可不连续
int OnlyRepeat_bitmap(int a[], int len)
{
    int i, re = 0;
    int *mark = (int *)malloc(len*sizeof(int));
    for(i = 0; i < len; i++) mark[i] = 0;

    for(i = 0; i < len; i++)
        if( mark[a[i]] == 1)
        {
            re = a[i];
            break;
        }
        else
            mark[a[i]] = 1;

    return re;
}
时间: 2024-10-06 18:03:33

求连续数组中唯一重复的元素的相关文章

找到数组中唯一重复的数

#include<iostream> #include<algorithm> #include<numeric> using namespace std; int helper1(int a[],int n) { int sum = accumulate(a,a+n,0); int sum2 = n*(n-1)/2; return sum-sum2; } int helper2(int a[],int n) { int bitor = a[0]^0; for(int i

9.10扩展性与存储限制(三)——若只有4KB内存可用,该如何打印数组中所有重复的元素

/** * 功能:给定一个数组,包含1到N的整数,N最大为32000,数组可能含有重复的值,且N的取值不定. * 若只有4KB内存可用,该如何打印数组中所有重复的元素. */ /** * 思路:4KB最多殉职8*4*2^10个比特.比32000大.创建含有32000个比特的位向量,其中每个比特代表一个整数. * 遇到重复元素,打印出来. * @param array */ public static void checkDuplicates(int[] array){ BitSet bs=new

js在数组中删除重复的元素自保留一个

js在数组中删除重复的元素自保留一个 第一种思路是:遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中 用到两个函数:for ...in 和 indexOf() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script type="text/javascript"> var student = ['qiang','ming','tao','li','liang','you','qiang'

Ex 2_14 去掉数组中所有重复的元素..._第二次作业

首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素.总的时间复杂度为O(nlogn). (这题应该用分支算法解决)以下为分支算法 代码不是分支算法 1 package org.xiu68.ch02.ex2; 2 3 public class Ex2_14 { 4 //基于分治法的归并排序算法 5 public static void main(String[] args) { 6 7 int[] a=new int[

找出数组中唯一重复的数(转)

题目: 数组a[N],1至N-1这N-1个数存放在a[N]中,其中某个数重复一次.写一个函数,找出被重复的数字. 方法一:异或法. 数组a[N]中的N个数异或结果与1至N-1异或的结果再做异或,得到的值即为所求. 设重复数为A,其余N-2个数异或结果为B. N个数异或结果为A^A^B 1至N-1异或结果为A^B 由于异或满足交换律和结合律,且X^X = 0  0^X = X; 则有 (A^B)^(A^A^B)=A^B^B=A 代码: #include <stdio.h> #include &l

javascript 返回数组中不重复的元素

这是实现结构伪类type-of-type的部分代码: <script type="text/javascript"> var ret= ["span","span","strong","span","b"] var norepeat = function(array){ var set = array.join(",")+","; wh

js学习笔记之在数组中删除重复的元素自保留一个

遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中 <script type="text/javascript"> var student = ['qiang','ming','tao','li','liang','you','qiang','tao']; function unique(arr){ // 遍历arr,把元素分别放入tmp数组(不存在才放) var tmp = new Array(); for(var

求有序数组中不重复数字的出现次数

不使用jdk的集合类,通过遍历数组得到,因为数组是有序的,在遍历数组的时候,统计整数是否重复出现,如果没有重复出现计数加一,若重复出现则是计数减一. java解决方法,时间复杂度O(n). public int countNoRepeatNum(int[] arr, int n) { if(arr == null || n <= 0) return -1; boolean repeat = false; int count = 1; int num = arr[0]; for(int i=1;i

在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数

题目描述: 求无序数组中任意两个元素的最大差值,以及存在最大差值的组别数. 输入: 输入包含两行,第一行输入一个整数n:第二行n个正整数,用空格隔开. 输出: 输出为一行,包含最大差值,以及存在组别数. 样例输入: 4 4  1  2  1 输出: 3  2 一种实现代码如下(Java版): 1 import java.util.Scanner; 2 /** 3 * 在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数 4 * @author JiaJoa 5 * 6 */