假设数组a有n个元素,元素取值范围是1~n,如何判定数组是否存在重复元素
方法一:位图法,原理是首先申请一个长度为n且均为’0’组成的字符串,字符串的下标即为数组a[]中的元素,然后从头开始遍历数组a[N],取每个数组元素的值,将其对应的字符串中的对应位置置1,如果已经置过1,那么该数就是重复的数。由于采用的是位图法,所以空间复杂度比较大,为O(N).
代码如下:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
bool xor_findDup(int * arr, int NUM)
{
int *arrayflag = (int *)malloc(NUM*sizeof(int));
int i = 1;
while (i < NUM)
{
arrayflag[i] = false;
i++;
}
for (i = 0; i < NUM; i++)
{
if (arrayflag[arr[i]] == false)
{
arrayflag[arr[i]] = true;
}
else
return true;
}
}
int main()
{
int a[] = {1,7,4,2,1,4,3,1};
if (xor_findDup(a, 8))
printf("存在重复元素");
else
printf("不存在重复元素");
getchar();
return 0;
}
方法二:对数组进行排序,然后比较相邻的元素是否相同。C++标准库提供了快速排序的方法qsort(),可以直接用的。
代码如下:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
int comp(const void *a, const void *b)
{
return (*(int *)a = *(int *)b);
}
int isArrayRepeat(int *a, int n)
{
int i = 0;
if (!a || n < 1)
return -1;
qsort(a, n, sizeof(int), comp);
for (i = 0; i < n - 1; i++)
{
if (a[i] == a[i + 1])
return 1;
}
return 0;
}
int main()
{
int result = -1;
int a[10] = { 10, 9, 5, 4, 7, 6, 3, 2, 1, 9 };
result = isArrayRepeat(a, 10);
if (result)
printf("yes\n");
else
printf("n0\n");
getchar();
return 0;
}
效果如图:

方法三:遍历数组,假设第i个位置的数字为i,则j的范围为1~n。通过交换将j换到下表为j-1的位置上。直到所有数字都出现在自己对应的下标处,或发生了冲突,即该位置已经被占。此时的时间复杂度为O(n)。
代码如下:
#include "stdafx.h"
#include <stdio.h>
int isArrayRepeat(int *a, int n)
{
int j = -1;
for (int i = 0; i < n; i++)
{
j = a[i];
if (i == j - 1)
continue;
if (a[i] == a[j - 1])
return 1;
a[i] = a[j - 1];
a[j - 1] = j;
i--;
}
return 0;
}
void main()
{
int result = -1;
int a[10] = { 10, 9, 5, 4, 7, 6, 3, 2, 1, 9 };
result = isArrayRepeat(a, 10);
if (result)
printf("yes\n");
else
printf("no\n");
getchar();
}
效果如图:

假设数组a有n个元素,元素取值范围是1~n,如何判定数组是否存在重复元素的更多相关文章
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- jQuery对html元素的取值与赋值实例详解
jQuery对html元素的取值与赋值实例详解 转载 2015-12-18 作者:欢欢 我要评论 这篇文章主要介绍了jQuery对html元素的取值与赋值,较为详细的分析了jQuery针对常 ...
- (转)jquery对表单元素的取值和赋值
/*获得text的值*/ var textval =$("#text_id").attr("value"); //或者 var textval =$(" ...
- jQuery对表单元素的取值和赋值操作代码
使用常规的思路:$(“#keyword”).value 取值是取不到的,因为此时$(‘#keydord’)已经不是个element,而是个jquery对象,所以应该使用:$(“#keyword”).v ...
- 常用html元素的取值和赋值方法总结
1.获得type类型为TEXT或者AREATEXT的值 var textval = $("#text_id").attr("value"); var textv ...
- jQuery对表单元素的取值和赋值操作代码(转)
使用常规的思路:$("#keyword").value 取值是取不到的,因为此时$('#keydord')已经不是个element,而是个jquery对象,所以应该使用:$(&qu ...
- jquery 元素文本取值/赋值
select元素选中option值 jq $("#select1 option:selected").text(); $("select id或class option: ...
- doc元素select 取值
- Cookie是以文本文件保存在客户端的,所以说cookie对象从本质而言是 字符串,所以取值时用字符串,或其数组
- 74 使用BitSet输出数组中的重复元素
[本文链接] http://www.cnblogs.com/hellogiser/p/using-bitset-to-print-duplicate-elements-of-array.html [题 ...
随机推荐
- MVC源码学习之AuthorizeAttribute
常见的Controller定义方式: public class HomeController : Controller { public ActionResult Index() { return V ...
- metrics 开发监控实现jdbc
Metrics 主要有五大基本组件1:Counter 记录执行次数2:Gauge 获取某个值3:Meter 用来计算事件的速率4:Histogram 可以为数据流提供统计数据. 除了最大值,最 ...
- mysql导入sql脚本
例如:我的用户名是root 密码是123 sql脚本存在C盘 名字为test.sql 数据库为test 有两种方法可以执行脚本 1:打开CMD输入以下命令(不需要转换目录)>mysql -u r ...
- 关于使用QTcpSocket的一些总结
QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险.必须 ...
- 关于Unity中LOD和渲染队列----渲染通道通用指令(一)
每个shader里面有很多的subshader,如果所以的subshader都不执行的话就,就执行fallback.每个subshader都可以设置一个LOD,整个shader也有一个LOD. 系统就 ...
- js放大镜代码
js原生放大镜 <!DOCTYPE html> <html> <head> <title>放大镜</title> <meta char ...
- 00-02.PHP 网站假设 之 学习PHP语法 [James建站]
PHP 手册 Stig Sæther Bakken Alexander Aulbach Egon Schmid Jim Winstead Lars Torben Wilson Rasmus Lerdo ...
- linux下硬盘的分区:
提到硬盘的分区,以前就是很乱,有什么主分区/扩展分区/逻辑分区等;它们有什么区别呢?现在简单的了解一下: 由于在MBR的主引导记录中的分区表里面最多只能记录4个分区记录,这个不够用啊,为了解决这个问题 ...
- Java数组遍历输出
在Java中,如何将字符串数组写入输出控制台? 以下示例演示了通过循环将数组的元素写入输出控制台. package com.yiibai; public class ArrayOutput { pub ...
- (转)在公司的局域网使用git或github 设置代理
目录 [hide] 1 生成SSH Key 2 git使用http访问 3 git使用ssh进行访问 在公司这样的局域网环境中,向要走网络必须走HTTP代理出去.不能直接访问外面的服务,所以这样安全了 ...