- 浏览: 2057109 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
题目: 有一个数组t[100],存放了1~99之间的数字,用效率较高的代码把重复数字去掉。例如数组{1,2,2,2,3,5,6,6}变成{1,2,3,5,6}。
××××××××××××××××××××××××××××××××××
申请标志数组
此题重复的数字可能不只一个,上述求和的方法不行了。因为是高效率,我们可以采用空间换时间的策略来解决。
设立访问标志数字,初始化为0,访问到N时将标志数字的第N个元素置为N
最后遍历该数组,若标志数组中对应值为非0,则顺序存储该数字于原数组中,最后返回去除重复数字后的有效数的个数
int RemoveRep(int array[], int n)
{
int *arrayflag = (int *)malloc(n*sizeof(int));
int left = 0, i = 0;
while(i<n)
arrayflag[i++] = false; //初始化标志数组
for(i=0;i<n;i++)//剔除算法
{
arrayflag[array[i]] = array[i]; //将出现过的数保存到对应的位置
}
for(i=0;i<n;i++) //取出有效数
{
if(arrayflag[i] != false)
array[left++] = arrayflag[i];
}
return left;
}
××××××××××××××××××××××××××××××××××
符号标志法
上述方法的空间复杂度为O(N),利用符号位作为标志即可不申请O(N)标志数组
int SignedRemoveRep(int array[], int n)
{
int i,left = 0;
for(i=0;i<n;i++)//将出现过的位置置负号标志
{
if(array[i] > 0)
array[array[i]] = -array[array[i]];
else
array[-array[i]] = -array[-array[i]];
}
for(i=0;i<n;i++)//抽取算法
{
if(array[i] < 0) //根据标志顺序保存出现过的值
array[left++] = i;
}
return left;
}
××××××××××××××××××××××××××××××××××
void main(void)
{
int t[100];
int i,j,left;
for(i=0;i<100;i++) //随机产生100个数字
{
j = rand()%99+1;
t[i] = j;
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
//left = RemoveRep(t, 100);
left = SignedRemoveRep(t, 100);
for(i=0;i<left;i++)
{
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
}
没错,是我疏忽了。第一次,出现数字时,将该数字的相应位置置为负数,当以后重复出现该数字时,就不应该在改变这个位置的符号了。
函数SignedRemoveRep中的部分代码改为如下:
for(i=0;i<n;i++)//将出现过的位置置负号标志
{
if(array[i] > 0)
{
if(array[array[i]]>0) //增加的
array[array[i]] = -array[array[i]];
}
else
{
if(array[-array[i]]>0) //增加的
array[-array[i]] = -array[-array[i]];
}
}
谢谢楼上兄台的指正!
××××××××××××××××××××××××××××××××××
申请标志数组
此题重复的数字可能不只一个,上述求和的方法不行了。因为是高效率,我们可以采用空间换时间的策略来解决。
设立访问标志数字,初始化为0,访问到N时将标志数字的第N个元素置为N
最后遍历该数组,若标志数组中对应值为非0,则顺序存储该数字于原数组中,最后返回去除重复数字后的有效数的个数
int RemoveRep(int array[], int n)
{
int *arrayflag = (int *)malloc(n*sizeof(int));
int left = 0, i = 0;
while(i<n)
arrayflag[i++] = false; //初始化标志数组
for(i=0;i<n;i++)//剔除算法
{
arrayflag[array[i]] = array[i]; //将出现过的数保存到对应的位置
}
for(i=0;i<n;i++) //取出有效数
{
if(arrayflag[i] != false)
array[left++] = arrayflag[i];
}
return left;
}
××××××××××××××××××××××××××××××××××
符号标志法
上述方法的空间复杂度为O(N),利用符号位作为标志即可不申请O(N)标志数组
int SignedRemoveRep(int array[], int n)
{
int i,left = 0;
for(i=0;i<n;i++)//将出现过的位置置负号标志
{
if(array[i] > 0)
array[array[i]] = -array[array[i]];
else
array[-array[i]] = -array[-array[i]];
}
for(i=0;i<n;i++)//抽取算法
{
if(array[i] < 0) //根据标志顺序保存出现过的值
array[left++] = i;
}
return left;
}
××××××××××××××××××××××××××××××××××
void main(void)
{
int t[100];
int i,j,left;
for(i=0;i<100;i++) //随机产生100个数字
{
j = rand()%99+1;
t[i] = j;
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
//left = RemoveRep(t, 100);
left = SignedRemoveRep(t, 100);
for(i=0;i<left;i++)
{
printf("%d ",t[i]);
if(i%10 == 9)
printf("\n");
}
}
评论
2 楼
mxdxm
2010-08-31
sebarzi 写道
算法SignedRemoveRep 有bug
int t[8]={3,3,3,6,6,7,2,4};
此时输出
2 3 4 7
把3 也输出啦!
int t[8]={3,3,3,6,6,7,2,4};
此时输出
2 3 4 7
把3 也输出啦!
没错,是我疏忽了。第一次,出现数字时,将该数字的相应位置置为负数,当以后重复出现该数字时,就不应该在改变这个位置的符号了。
函数SignedRemoveRep中的部分代码改为如下:
for(i=0;i<n;i++)//将出现过的位置置负号标志
{
if(array[i] > 0)
{
if(array[array[i]]>0) //增加的
array[array[i]] = -array[array[i]];
}
else
{
if(array[-array[i]]>0) //增加的
array[-array[i]] = -array[-array[i]];
}
}
谢谢楼上兄台的指正!
1 楼
sebarzi
2010-08-24
算法SignedRemoveRep 有bug
int t[8]={3,3,3,6,6,7,2,4};
此时输出
2 3 4 7
把3 也输出啦!
int t[8]={3,3,3,6,6,7,2,4};
此时输出
2 3 4 7
把3 也输出啦!
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1894DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2358k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1552所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2415转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1933mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1616为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1715#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6842两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1565Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1594C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1859一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1588显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1370先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1845使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1786四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1899在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1637线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1767今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4077关于C++对函数传参与函数返回值进行引用传递的详解 ...
相关推荐
unique 函数的基本语法为:B = unique(A),其中 A 是要处理的数组,B 是去除重复值后的数组。 例如,在命令行窗口中输入以下命令: ```matlab a = [1 3 4 5 6 6 7 8 9 8]; b = unique(a); ``` 然后,Matlab 将删除...
用算法去除数组中重复的数字(不使用查重函数)通过嵌套for循环和if条件判断实现,用算法去除数组中重复的数字(不使用查重函数)通过嵌套for循环和if条件判断实现
在处理这样的数据集时,经常需要去除重复的记录,以确保数据的准确性和效率。 ### PHP中的二维数组去重方法 给定的代码片段展示了如何在PHP中定义一个函数`unique_arr`,用于去除二维数组中的重复项。这个函数接受...
C语言 数组中重复的数字解决方法: 题目:在一个长度为n的数组里的所有数字都在0-n-1的 范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字...
YAHOO.util.YUILoader类中的一个方法提供了一种巧妙的解决方案,通过将数组转换为对象来去除重复项。这种方法利用了JavaScript对象的键不可重复性,从而有效地解决了问题。下面我们将详细探讨这个方法的实现、思路和...
在JavaScript中,合并两个数组并去除重复项是一个常见的任务,特别是在处理数据集合或者组合不同来源的数据时。这里我们将深入探讨几种不同的方法来实现这个功能。 首先,我们可以使用`concat()`方法来合并两个数组...
总结起来,去除JavaScript数组中的重复项有多种策略,包括常规模式、利用`sort()`函数以及利用JSON对象。每种方法都有其适用场景,开发人员应根据实际需求选择最适合的方法。在处理大量数据时,推荐使用利用JSON对象...
在Java中,我们还可以使用其他的去重复工具和方法,例如在线去除重复项工具、在线文本去重复工具等。这些工具可以帮助我们快速地过滤掉数组中的重复数据。 本文主要介绍了Java中替换int数组中重复数据的方法,包括...
比如提供的在线去除重复项工具和在线文本去重复工具链接,它们简化了重复元素查找的过程,尤其适合非编程人员使用。 此外,本文还提到了一些扩展阅读资源,包括《JavaScript数组操作技巧总结》、《JavaScript排序...
- 在处理大数据时,考虑使用 LINQ(Language Integrated Query)来简化代码,如`Distinct`方法可轻松去除重复元素。 - 使用适当的数据结构,如HashSet或Dictionary,可以提高性能和代码的可读性。 总之,VB.NET中...
`assoc_unique`函数会去除重复的`id`,并且最后按照`id`的值对数组进行排序。运行这段代码后,`$aa`将只包含不重复且排序过的元素。 这个函数对于处理包含重复键值的数据集合非常有用,例如从数据库查询结果中去重...
在JavaScript编程中,处理数组是常见的任务之一,而去除数组中的重复元素则是一项基本操作。数组去重可以提升数据处理的准确性和效率,尤其是在处理大量数据时。这里我们将探讨两种不同的JavaScript方法来实现这个...
除此之外,文档还提供了一些实用的在线工具,比如在线去除重复项工具、在线文本去重复工具、字数统计工具以及在线字符统计与编辑工具等,这些工具在处理字符串或数组时可以提供辅助性帮助。 总结上述方法,我们可以...
这种方法解决了原始第三种方法中的一个潜在问题,即如果数组中同时存在数字和字符串,它们的值可能相同(例如数字5和字符串'5'),直接作为对象的属性名会导致覆盖。通过将它们的值转换成字符串再拼接其类型,就能...
这样可以快速去除重复元素,但需要额外的内存空间。 2. **排序后去重**:对数组进行排序后,相邻的重复元素会集中在一起,通过遍历一次排序后的数组,只需保留第一个出现的元素即可。这种方法的时间复杂度是O(n log...
这个函数通过删除数组中的重复值来“清洗”数组,使得数组中不会有重复的元素。array_unique()函数在处理数组时,会保留遇到的第一个元素值,并删除之后遇到的所有具有相同值的元素,最终返回一个没有重复值的新数组...
JavaScript中去除数组重复元素的方法主要涉及两种函数:isExistInArr 和 distinct。这两个函数配合使用可以实现数组去重的功能。接下来,我将详细解释这两种方法的实现原理以及在实际操作中如何应用。 首先,函数...
这个函数首先使用`array_multisort()`按键倒序排序数组,然后用`array_unique()`去除重复的值。这说明了在PHP中,可以编写自定义函数来实现特定的数组去重逻辑,尤其是当标准函数`array_unique()`无法满足需求时。 ...