一个大小为101的数组,其中由100个连续元素乱序分布在数组中,并有两个是重复的数值。查找到101中的2个重复的数的位置?
2013-11-26 来自:SavagegavaS 5 人回应

如11个数值,【1,5,2,6,7,8,3,4,9,9,10】,范围1~10,但有2个重复。查找到10中的2个重复的数的位置,并保证时间复杂度低于O(n)

2013-12-01 来自:金子

用PHP写了一段 测试可用 申请了一个数组 不知是否符合
原理就是将原数组的值作为临时数组的键,循环时判断是否值为1。如果不为1,则将其赋值为1

<?php
$arr = array(1,5,2,6,7,8,3,4,9,9,10);
echo getre($arr);

function getre($arr){
$len = count($arr);

foreach($arr as $v){
if($tmp[$v] == 1){
return $v;
}else{
$tmp[$v] = 1;
}
}
}
?>
2013-11-30 来自:Tori.h

用PHP写了一段 测试可用 申请了一个数组 不知是否符合
原理就是将原数组的值作为临时数组的键,循环时判断是否值为1。如果不为1,则将其赋值为1

  
<?php
$arr = array(1,5,2,6,7,8,3,4,9,9,10);
echo getre($arr);

function getre($arr){
$len = count($arr);

foreach($arr as $v){
if($tmp[$v] == 1){
return $v;
}else{
$tmp[$v] = 1;
}
}
}
?>
2013-11-28 来自:Circle❤Teuk

先对数组排序并保持索引关系输出,然后比较元素与他的上一个元素是否相等,如果相等,则返回该元素的键名
$arr = array(1,5,2,6,7,8,3,4,9,9,10);
echo getRepeat($arr);
function getRepeat($arr)
{
asort($arr);
foreach($arr as $k=>$v)
{
if($v==$last)
return $k;
else
$last=$v;
}
}

2013-11-28 来自:小胖肥的想念

连续元素的话, 先遍历得到最大值max, 最小值min, 总和sum.然后min+(min+1)+...+max -sum 得到重复的那个数, 遍历数组得到对应的位置.时间复杂度O(n), 空间复杂度O(1)

@justjavac在 类似的问题@一个大小为101的数组,先是用1-100中的不同的数字来填充数组的100个元素。剩下的那个元素用1-100之间的一个随机的数字填充。请用程序实现,查找到那个随机数的值。 里提供了方法,用异或替换了 加运算. 效率更高, 也不会溢出.

或者用hash表, 得出重复的那个数. 再遍历一遍数组, 得到对应的位置. 时间复杂度O(n), 空间复杂度也是O(n)

2013-11-27 来自:mf

我自己突然想到两个方法,可以将效率提升到 <= O(n).

1.hash方法
利用求余法作为hash策略,扫描数组,hash定址之后记录数值和当前扫描的位置。
当出现定址出现冲突的时候就是重复的数值,此时也可以知道另外一个数值的地址。

2.伪位图方法
采用100大小的结构体,每个结构体是由扫描的数值和数组位置组装而成,根据数值大小确定在结构体数组中的位置,从而使得下一次重复数据出现时,会定址到相同的位置。并得知其位置。

您的回应

你还未登陆,不能回应!登陆