从数组中删除重复的元素,并考虑算法的执行效率

写一个函数来从数组中删除重复的对象。维持秩序。例如,如果输入的数组[ 1,5,4,2,7,2,6,5 ],结果应该是[ 1,5,4,2,7,6 ]。实施时应执行速度的优化。

回答: 从数组中删除重复的元素,并考虑算法的执行效率

  1. 最快的算法肯定是O(n)
    具体做法是:
    1,准备一个HashMap或者HashTable
    2,循环你的输入数组,判断他是否在HashMap中,如果不是,输出,并且加入到HashMap中(比如:Map.put(1,true)),如果是在HashMap中则什么都不做。

    因为HashMap的读取和设置是O(1)的时间复杂度,所以加上循环整体的时间复杂度也是O(n)

如何去除数组中的重复元素?

  1. Q
    如何去除数组中的重复元素?谁能用VBS写个函数,谢谢
  2. A


    arr= Array(1,3,4,4,6,3,2,3,1)
    WScript.Echo Join(distinct(arr), ",")
    Function distinct(arr)

        Dim dic, i
        Set dic = CreateObject("Scripting.Dictionary")
        For i = 0 To UBound(arr)
            If Not dic.Exists("k_" & Cstr(arr(i))) Then
                dic.Add "k_" & Cstr(arr(i)), arr(i)
            End If
        Next
        distinct = dic.Items()
    End Function

数组中删除最少元素使其先增后减

  1. Q
    一道笔试题目:

    在一个数组中删除最少数目的元素是其剩余元素先严格单调递增后严格单调递减(假设如果数组本身是严格单调的也符合条件)

    例如:9,5,6,7,5,6,5,3,1
    可删除9和5(第二个)即可:5,6,7,6,5,3,1
    感觉挺复杂的,不知哪位大师给点指导
  2. A
    我感觉最麻烦的地方在怎么判断当前的结果是否就是最优解。

    要不然枚举所有情况出来,具体的枚举算法优化不是很容易做。

给定一个整数型的数组,和一个特定的整数值.编程求出数组中任两个元素的差等于给定整数值的值对?

  1. Q
    给定一个整数型的数组,和一个特定的整数值。编程求出数组中任两个元素的差等于给定整数值的值对?
    如题,自己初步想了下,貌似是一道关于排列组合的问题,不知道有没有更完美的解决方法?
    请赐教
    问题补充:robertliudeqiang 写道程序如下,排序的时间复杂度O(nlgn),后面进行减法需要一次遍历,时间复杂度O(n),总的时机复杂度O(nlgn)

    public class TestClass{
    
        public static void printPairs(int number, int[] list) {
            if (list.length < 2)
                return;
    
            // 使用java工具类排序,也可以自己排序
            Arrays.sort(list);
    
            for (int i = list.length; i > 1; i--) {
                if (list[i - 1] - list[i - 2] == number) {
                    System.out.println("pair: " + list[i - 1] + ", " + list[i - 2]);
                }
            }
        }
    
        public static void main(String[] args) {
            int number = 5;
            int[] list = { 45, 60, 42, 83, 36, 10, 16, 21, 15 };
            printPairs(number, list);
    
        }
    }


    运行结果:
    pair: 21, 16
    pair: 15, 10

    能解释一下为什么从高到底依次做差就一定能保证成对的元素呢?会不会有漏掉的呢?
  2. A
    改进的算法,免去了很多不必要的比较。提高算法的效率,保证了结果的正确性。
    import java.util.Arrays;
    
    public class TestClass{
    
        public static void printPairs(int number, int[] list) {
            if (list.length < 2)
                return;
            boolean b = false;
            Arrays.sort(list);
            //首先取最大值,看是否存在这样的值对
            if(number>(list[list.length-1]-list[0])){
            	System.out.println("不存在这样的值对");
            	return;
            }
            //下面从第一个元素开始判断,和后面的值做差。如果差值超过number,停止与后面更大的数值比较
            for(int i  = 0;i<list.length-2;i++)//最后一个元素不用取。
            {
            	int j=i;
            	while(number>=(list[j]-list[i])){
            		if(number==(list[j]-list[i])){
            			b = true;
            			System.out.println(list[j]+" "+list[i]);}	
            		if(++j>list.length-1)break;//和最后一个数组做差,退出。
            	}
            }
            if(!b){System.out.println("不存在这样的值对");}
        }
    
        public static void main(String[] args) {
            int number = 51;
            int[] list = { 45, 60, 42, 83, 36, 10, 16, 21, 15 };
            printPairs(number, list);
    
        }
    }
    

PHP 数组中如果有一个元素相同,如何拼接其他元素

  1. Q
    比如原数组是这样的
    array(3) {
    [0] => array(6) {
    ["pla_id"] => string(3) "298"
    ["user_id"] => string(1) "1"
    ["due_in"] => string(15) "8.33"
    }
    [1] => array(6) {
    ["pla_id"] => string(3) "976"
    ["user_id"] => string(1) "1"
    ["due_in"] => string(15) "338.90"
    }
    [2] => array(6) {
    ["pla_id"] => string(3) "56"
    ["user_id"] => string(1) "2"
    ["due_in"] => string(15) "25.6"
    }}
    因为数组中的user_id=1 是一样的
    要得到最后这样数组,要怎么写(就是把user_id相同的其他元素拼接在一起)?
    array(3) {
    [0] => array(6) {
    ["pla_id"] => string(3) "298,976"
    ["user_id"] => string(1) "1"
    ["due_in"] => string(15) "8.33,338.90"
    }
    [1] => array(6) {
    ["pla_id"] => string(3) "56"
    ["user_id"] => string(1) "2"
    ["due_in"] => string(15) "25.6"
    }}
  2. A
    $a = array(
      array(
        "pla_id" => "298",
        "user_id" => "1",
        "due_in" => "8.33",
      ),
      array(
        "pla_id" => "976",
        "user_id" => "1",
        "due_in" => "338.90",
      ),
      array(
        "pla_id" => "56",
        "user_id" => "2",
        "due_in" => "25.6",
      )
    );
    $b = array();
    foreach($a as $v) {
      if(! isset($b[$v['user_id']])) $b[$v['user_id']] = $v;
      else $b[$v['user_id']]["due_in"] .= ',' . $v["due_in"];
    }
    var_dump(array_values($b));
    array(2) {
      [0]=>  array(3) {
        ["pla_id"]=>    string(3) "298"
        ["user_id"]=>    string(1) "1"
        ["due_in"]=>    string(11) "8.33,338.90"
      }
      [1]=>  array(3) {
        ["pla_id"]=>    string(2) "56"
        ["user_id"]=>    string(1) "2"
        ["due_in"]=>    string(4) "25.6"
      }
    }

去除js数组中的重复元素

  1. Q
       var array = [1,'1',1,'1',true,'true',2,3,2];
       要求结果为:[1,'1',true,'true',2,3];顺序无要求,但时间复杂度尽可能低,最好是O(n)。给出答案前千万要试运行一遍呐,网上的例子都不行。
  2. A
    这个运行了是你要的结果,网上给的答案,你试试行不
    var array = [1,'1',1,'1',true,'true',2,3,2];
    Array.prototype.distinct = function(){
    var newArr=[],obj={};
    for(var i=0,len=this.length;i<len;i++){
    if(!obj[typeof(this[i]) + this[i]]){
    newArr.push(this[i]);
    obj[typeof(this[i])+this[i]]='new';
    }
    }
    return newArr;
    };
    alert(array.distinct());

ASP数组中去掉重复的,写入一个新的数组中

  1. Q
    有一个数据里面的很多重复的数据,现要去掉重复的,写入一个新的数组 ,怎么写?
    如:aa = Array("11","22","33","11","112233","33","22","44","44","11","ff","22","22","去")
  2. A
    LS思路不错,不过太不通用,对于XXXXYYXXXX之类的会无视。

    On Error Resume Next
    aa = Array("11","22","33","11","112233","33","22","44","44","11","ff","22","22","去")

    Set oRecordSet = CreateObject("Adodb.RecordSet")
    With oRecordSet
    For Each item In aa
    .Fields.Append item,200,32
    Next
    End With


    For Each item In oRecordSet.Fields
    WScript.Echo item.Name
    Next

    Set oRecordSet = Nothing

C++成员函数中的静态局部变量能不能提高程序的执行效率

  1. Q
           现在有这个疑问,我有一个功能函数需要频繁调用,这个函数里面的临时变量比较多,我担心这么多的临时变量在这个高频调用的函数里面会影响程序执行的效率,我想将这些局部临时变量改为局部静态变量,不知道这样做能不能提高程序执行效率?
            另外,在程序性能优化方面有什么好的建议可以说说?
  2. A
    首先确定影响性能的主要因素,再对症下药,不要盲目优化。 试试vtune,找到性能瓶颈。

如何使用CopyMemory删除数组中重复的元素

  1. Q
    有一个数组很大,接近2万左右,现在需要从这个数组中,把重复的元素删除后,重新打印这个数组!

    循环太耗CPU了!!!效率太低了!
  2. A
    对dictionary的了解比较少,知道的不多,看VB6的MSDN中“语言特性的新内容”中的简单介绍:
    ---------------------------------------------------------------------
    Dictionary 对象
    所有版本 Dictionary 对象克服了 Collection 对象的一些局限性,而且使用起来也更加方便,因为在通常的操作过程中它产生的运行时错误更少,并且具有更大的灵活性。

    还有:
    Dictionary 对象与 PERL 关联数组等价。可以是任何形式的数据的条目被存储在数组中。每个条目都与一个唯一的关键字相关联。该关键字用来检索单个条目,通常是整数或字符串,可以是除数组外的任何类型。
    ---------------------------------------------------------------------
    没有对其效率和其它方面作介绍

    AisaC在43楼的代码是不是忽略了一点细节?Dictionary和Collection的add方法中,二者的key参数位置是不一样的(相反的),Collection的key只能是string类型...当然我那个测试也是片面的,使用了long类型,这样Dictionary的性能就远高于Collection ...刚才没事大概测试了string类型,非常意外的是随着数据量的增加,Dictionary效率飞速下降,add至10万数组,Collection开始领先了...


    至于dic.Exists(key), Tiger_Zhao的解释应该是对的,既然key是关健字,应该有它自己的结构... 

在javascript数组中有几个对象元素,如何删除指定值的对象,并返回剩余对象组成的数组?详情如下(有点难度哦):

  1. Q
    //先定义3个对象
    var america={
      name:'美国',
      city: '华盛顿市',
      detail: {
        total: {
          population: "65万",
           area: {
            number: "177平方公里"
          }
        }
      },
      goodPlace:['白宫','国会山','林肯纪念堂']
    };
    var china={
      name:'中国',
      city: '北京市',
      detail: {
        total: {
          population: "2151.6万人",
           area: {
            number: "1.641万平方千米"
          }
        }
      },
      goodPlace:['天安门','故宫','颐和园']
    };
    var japan={
      name:'日本',
      city: '东京',
      detail: {
        total: {
          population: "1333万",
           area: {
            number: "2188平方公里"
          }
        }
      },
      goodPlace:['东京塔','银座','东京迪斯尼']
    };
    //要操作的数组
    var arr = [america,china,japan]; 

    //我想写一个函数,这个函数的功能是:删除数组中指定数值的元素,返回剩下的数组

    //函数定义如下
        Array.prototype.del=function(value){ 
          //函数内容
        }; 

    举例说明:比如我想删除第二个元素china,我就调用arr.del(china),调用后arr的内容就变成[america,japan]

    请高手指教,如何写这个函数,多谢了,分不够还可以加分哦

  2. A
    楼上说的很好,我想有另外一个数组做变量,来存放操作过程,也是可以的