当前位置:编程学习 > C#/ASP.NET >>

高分请教曾经遇到的一道笔试题!

去除一个数组中的重复值,要求:不能使用“借助临时数组或新生成另一个数组”的方法,也不能使用某些函数库中提供的功能。请各位大侠指教。用C#语言实现。多谢!!! --------------------编程问答-------------------- 没时间要求吗,那还不容易 --------------------编程问答--------------------
引用楼主 zuocg 的帖子:
去除一个数组中的重复值,要求:不能使用“借助临时数组或新生成另一个数组”的方法,也不能使用某些函数库中提供的功能。请各位大侠指教。用C#语言实现。多谢!!!


某些函数库是哪些? --------------------编程问答-------------------- 循环吧 --------------------编程问答-------------------- 某些库函数就是指,一些类似排序或者自动查找重复值以及自动剔除重复值之类的函数。这些不能用 --------------------编程问答-------------------- MicroDeviser ,哥们你的回答没任何意义!!如果你会,请写出详细过程。 --------------------编程问答-------------------- 用正则算不? --------------------编程问答-------------------- 对数组中的每个数都与其后面的数字进行对比,如果相等,在与之相等的XX数字删除。
好像效率不高~ --------------------编程问答-------------------- 感觉就是用循环一个一个比较...我才刚开始学C#..还不是很会..就那么个方法..虽然很烦..但感觉应该可以。..
每一个和前面所有比较.相等的就删除... --------------------编程问答-------------------- 用LinQ行不行,呵呵。
int[] test = { 1, 2, 3, 4, 5, 6, 6, 7, 1, 123, 3, 4, 1, 2, 321, 1 }; 

            var query = from n in test  
                        group n by n into g 
                        where g.Count() > 1 
                        select new 
                        { 
                            g.Key 
                            //,CountTest = g.Count() 
                        }; 
--------------------编程问答-------------------- 抛砖引玉

ArrayList arrayList = new ArrayList(100);
arrayList.Add("0");
arrayList.Add("0");
arrayList.Add("0");
arrayList.Add("1");
arrayList.Add("0");
arrayList.Add("1");
arrayList.Add("1");
arrayList.Add("4");
arrayList.Add("5");
for (int i = 0; i < arrayList.Count; i++)
{
for (int j = i + 1; j < arrayList.Count; )
{
if (arrayList[i].Equals(arrayList[j]))
{
arrayList.RemoveAt(j);
}
else
{
j += 1;
}
}
} --------------------编程问答--------------------

ArrayList arr = new ArrayList();
           arr.Add("string");
            arr.Add("int");
            arr.Add("double");
            arr.Add("int");
            arr.Add("float");
            arr.Add("td");
            arr.Add("string");
            arr.Add("int");
            arr.Add("double");
            arr.Add("int");
            arr.Add("float");
            arr.Add("td");

            string s = arr[0].ToString();
            int count = arr.Count;
            for (int i = 1; i < count; i++)
            {  
                if (s.Contains(arr[i].ToString()))
                {
                    arr[i] = "false";
                }
                s += " " + arr[i];
            }
            arr.Sort();
            int k = 0;
            int m = 0;
            bool flag = true;

            for (int i = 0; i < count; i++)
            {
                if (arr[i].Equals("false") )
                {
                    m++;
                    if (flag)
                    {
                        k = i;
                        flag = false;
                    }
                }

            }
            arr.RemoveRange(k,m);
--------------------编程问答--------------------  public int[] CopyAllArray(int[] p_List)
        {
            int[] _ReturnList = new int[p_List.Length];

            for (int i = 0; i != p_List.Length; i++)
            {
                _ReturnList[i] = p_List[i];
            }
            return _ReturnList;
        }

不知道是不是这个意思 --------------------编程问答-------------------- 要用递归。

private void Clear(string value,ArrayList list)
{
   int deletedCount = 0;
   for (int i = 0;i < list.Count;i ++)
   {
      if (value == list[i].ToString())
      { 
         deletedCount ++;
         if (deletedCount > 1)
         {
            list.RemoveAt(i);
            Clear(value,list);
            return;
         }
      }
   }
}


抛砖引玉 

ArrayList arrayList = new ArrayList(100); 
arrayList.Add("0"); 
arrayList.Add("0"); 
arrayList.Add("0"); 
arrayList.Add("1"); 
arrayList.Add("0"); 
arrayList.Add("1"); 
arrayList.Add("1"); 
arrayList.Add("4"); 
arrayList.Add("5"); 

for (int i = 0;i < arrayList.Count; i ++)
{
   string value = arrayList[i].ToString();
   Clear(value,arrayList);
} --------------------编程问答-------------------- 注意条件:是数组,不能使用某些函数库中提供的相关功能


            string[] ss ={ "1", "2", "1", "3" };
            int len = ss.Length;
            string str = "";
            for (int i = 0; i < len; i++)
            {
                if (str.Contains("[" + ss[i] + "]"))
                    ss.SetValue(null, i);
                else
                    str += "[" + ss[i] + "]";
            }
            ss = String.Join("$", ss).Split(new char[] { '$' }, StringSplitOptions.RemoveEmptyEntries);
--------------------编程问答-------------------- 转换成INT型数组,再用符号标志法
--------------------编程问答-------------------- 感谢大家的回复,其实他给了一个数组int a[]={1,4,2,4,8,2,34,5,8,9}。就是一个普通数组,所以不能用ArrayList。请各位帮忙想想,多谢 --------------------编程问答--------------------
引用 16 楼 zuocg 的回复:
感谢大家的回复,其实他给了一个数组int a[]={1,4,2,4,8,2,34,5,8,9}。就是一个普通数组,所以不能用ArrayList。请各位帮忙想想,多谢

那这个重复值是置成某个特殊值?还是彻底去掉? 如果是彻底不要 就一个破同数组还挺有难度的! --------------------编程问答-------------------- 自己写个排序,就可以了。

我真的发现相当多的程序员都不懂算法和数据结构
--------------------编程问答-------------------- 呵呵,不用某些库,指的是啥??

14楼算最符合题意,不过str.Contains(),String.Join(),算不算用了某些库呢?? --------------------编程问答-------------------- 快速交换排序 然后 每个元素和他之后的元素相比,应该是 2o ln(o)的复杂度 --------------------编程问答--------------------
引用 5 楼 zuocg 的回复:
MicroDeviser ,哥们你的回答没任何意义!!如果你会,请写出详细过程。
我觉得很有意义,如果没有时间要求,我们可以用最简单的想法来实现,那就是先排序,然后遍历查重 --------------------编程问答-------------------- 有排序必要么? --------------------编程问答--------------------
引用 16 楼 zuocg 的回复:
感谢大家的回复,其实他给了一个数组int a[]={1,4,2,4,8,2,34,5,8,9}。就是一个普通数组,所以不能用ArrayList。请各位帮忙想想,多谢


排序,比较相邻的数。
不能有新数组,那重复的数怎么办?交换到最后?
有关排序,举个例子,冒泡:
        private int[] ArraySort(int[] array)
        {
            int temp;
            for (int i = 0; i < array.Length; i++)
            {
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[i] > array[j])
                    {
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
                }
            }
            return array;
        }

其他排序,可以看看下面这个帖子:
http://topic.csdn.net/u/20090101/10/b1b76d48-3bf8-4b20-ae93-4ec7c8b4e75b.html --------------------编程问答-------------------- 出这道题目的人根本不懂C#,C#里数组是固定的长度不可改变的,要想扩充或裁减一个数组必须创建一个新的数组。 --------------------编程问答-------------------- 不能使用“借助临时数组或新生成另一个数组”的方法
如果要是数组的话,如 string[] a;这样的这个题没解
因为数据一旦创建 就没有办法改变大小!

如果是动态数组 那直接比较Remove就行了 --------------------编程问答-------------------- 数组大小是无法改变的,如果都不许用,是无法去除的 --------------------编程问答-------------------- 感谢大家的回复!我也感觉奇怪,普通的数组,重复的元素要如何去掉呢?!请高手们帮忙,是否有其他解法?
TO:aimeast,这位高人,你看清题目要求,不要懂点皮毛就到这胡说一通,难道这么多专家都不如你?你要行,你就把实现写出来!别废话连篇的。 --------------------编程问答-------------------- 折半查找,可以吗?学习中。。。 --------------------编程问答-------------------- 遍历一遍先减后加,应该可以的 --------------------编程问答--------------------         public string[,] 清理相同值(string[,] 二维数组)
        {
            for (int i = 0; i < (二维数组.Length/2)-1; i++)
            {
                for (int j = (二维数组.Length/2)-1; j >i; j--)
                {
                    if(二维数组[i,0]!=null)
                    {
                        if (二维数组[i,0].Equals(二维数组[j,0]) && 二维数组[i,1].Equals(二维数组[j,1]))
                        {
                            二维数组[j,0] = null;
                            二维数组[j,1] = null;
                        }
                    }

                }
            }
            return 二维数组;
        }
这是我实际中用到的。 --------------------编程问答--------------------  
int []a={1,4,2,4,8,2,34,5,8,9};
for (int i = 0; i < a.Length; i++)
           {
               for (int j = i+1; j < a.Length; j++)
               {
                if(   a[i].CompareTo(a[j])==0)
                   {
                       MessageBox.Show(a[i].ToString());//去掉的值
                       a.SetValue(null, i);
                       break;
                }
               }
           }

看看这个
不过好想也有问题,设成null的值默认位0 --------------------编程问答-------------------- 友情幫頂 --------------------编程问答-------------------- 多次循环比较! --------------------编程问答-------------------- 我是菜鸟 我只看看 不说话 --------------------编程问答-------------------- 去除重复的还不是重新生成的?
原来有7个元素  2个重复的。。。其实就是有6个不同的
最后数组是6个元素   还不是重新生成? --------------------编程问答-------------------- 问题很简单,只需要两个临时的变量a和count就可以。

方法如下:
把数组第一个元素放入a,循环把a的值与数组中的元素进行比较,第二个相等的数组元素一律置空(count=2时),再处理第二,第三个元素直到最后一个,打印输出。 --------------------编程问答--------------------
引用 36 楼 fskjb01 的回复:
问题很简单,只需要两个临时的变量a和count就可以。 

方法如下: 
把数组第一个元素放入a,循环把a的值与数组中的元素进行比较,第二个相等的数组元素一律置空(count=2时),再处理第二,第三个元素直到最后一个,打印输出。


置空不行,那就给一个任意大的值吧,输出时把这个值排除在外就行!!! --------------------编程问答-------------------- 可以先排序,然后把相邻值相同的去掉 --------------------编程问答-------------------- 感谢大家的回复,还有没有更好的办法。大家的办法,我感觉好像不是很符合题目的初衷! --------------------编程问答-------------------- 不能使用“借助临时数组或新生成另一个数组”
int a[]={1,4,2,4,8,2,34,5,8,9}

就是说代码里除了int a[] 数组外不会有其他的数据了

不能使用某些函数库中提供的功能
是不是说什么List,ArrayList对象都不要用了

去除一个数组中的重复值

题目只要求去除数组中重复的值,而不是置空或是删除,有个想法就是把重复的值换一个其他的值(纯属个人理解)

借用一下min_jie的排序方法:
先给数据a排下序
[
            int a[]={1,4,2,4,8,2,34,5,8,9};
            int temp;
            for (int i = 0; i < a.Length; i++)
            {
                for (int j = i + 1; j < a.Length; j++)
                {
                    if (a[i] > a[j])
                    {
                        temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
/code]

结果:a[]={1,2,2,4,4,5,8,8,9,34};
现在要做的是去除数组中重复的值

[code=C#]
for (int i = 0; i < a.Length-1; i++)
          {
                if(  a[i+1]==a[i])
                 {
                  a[i+1] = a[a.Length-1]+i;//随便设个什么值只要不重复就行
                }
          } 



好了,不知道楼主是否满意。O(∩_∩)O~ --------------------编程问答-------------------- 我是猎头公司的angel,目前有.net的相关需求,要求有5年以上的c#.net的相关经验,英文能进行英文面试,base:上海
感兴趣的请联系我
email:angel@jingjie-wisemen.com
msn: angel_lu@live.hk --------------------编程问答-------------------- 哎呀,糟了

多次重复上面的代码就不行了。

主要是对去除重复值的不同理解,如果同意我的理解的话,我相信楼主应该也能写自己满意的答案了。 --------------------编程问答-------------------- 多谢 holydsj 的回复。现在看来,确实是有可能这道题出的有问题。 --------------------编程问答--------------------
//写一个将重复数字放到最后的方法:
private int[] GetArray(int[] data)
{
int temp=0,index=0;//index计算有多少个重复的数字,temp用于交换
for(int i=0;i<data.Length-index;i++)
{
for(int j=i+1;j<data.Length-index;j++)
{
if(data[i]==data[j])//出现重复数字,将j位置的数字移到最后
{
temp=data[j];
for(int k=j+1;k<data.Length-index;k++)//后面的数前移一位
data[k-1]=data[k];
data[data.Length-index-1]=temp;//重复的数字放在后面
index++;
j--;
}
}
}
return data;
}


用int[] a={1,4,2,4,8,2,34,5,8,9}进行测试,结果返回:
1,4,2,8,34,5,9,8,2,4

除了重复的数字被放到最后外,其他数字顺序不变。
--------------------编程问答--------------------
引用 27 楼 zuocg 的回复:
感谢大家的回复!我也感觉奇怪,普通的数组,重复的元素要如何去掉呢?!请高手们帮忙,是否有其他解法?
TO:aimeast,这位高人,你看清题目要求,不要懂点皮毛就到这胡说一通,难道这么多专家都不如你?你要行,你就把实现写出来!别废话连篇的。


我敢肯定你的数据结构学的很不好!

既然题目这样出,肯定是有他的目的。
比较容易想到的思路是先排序,然后用两个伪指针去重。

如果用c++实现这样的问题,会简单很多。因为不能够开新的数组,就要用指针。

写这样的代码没有一点技术含量,特别是使用.net的库。

用C#只是一个工具,它会帮你完成很多简单的事情,会使人懒惰。

上面回答出来问题的人,随便找几个出来,我估计没有几个能把正确的快排给写出来。

现在大多的程序员,基本功一点也不扎实! --------------------编程问答-------------------- 用ArrayList排序,然后光比较相邻的就可以 --------------------编程问答-------------------- 最简算法,利用hash表。
        private static void Trim(int []a)
        {
            Hashtable ht = new Hashtable();
            foreach (var i in a)
            {
                try
                {
                    ht.Add(i, i);
                }catch(Exception e)
                {
                    continue;
                }
            }
            foreach (int i in ht.Values)
            {
                Console.Write(string.Format("{0},",i));
            }
            Console.WriteLine();
        } --------------------编程问答--------------------
引用 18 楼 aimeast 的回复:
自己写个排序,就可以了。

我真的发现相当多的程序员都不懂算法和数据结构


引用 45 楼 aimeast 的回复:
引用 27 楼 zuocg 的回复:
感谢大家的回复!我也感觉奇怪,普通的数组,重复的元素要如何去掉呢?!请高手们帮忙,是否有其他解法?
TO:aimeast,这位高人,你看清题目要求,不要懂点皮毛就到这胡说一通,难道这么多专家都不如你?你要行,你就把实现写出来!别废话连篇的。


我敢肯定你的数据结构学的很不好!

既然题目这样出,肯定是有他的目的。
比较容易想到的思路是先排序,然后用两个伪指针去重。

如果用c++实现这样的问题,会简单很多。因为不能够开新的数组,就要用指针。

写这样的代码没有一点技术含量,特别是使用.net的库。

用C#只是一个工具,它会帮你完成很多简单的事情,会使人懒惰。

上面回答出来问题的人,随便找几个出来,我估计没有几个能把正确的快排给写出来。

现在大多的程序员,基本功一点也不扎实!


很明显 直接遍历就能搞定的事情 为什么一再强调要排序 --------------------编程问答-------------------- 不知道用哈希表算不算
利用 
try{}
catch{}
一个循环就完了,根据哈希表的特性,用KEY值是不能塞进重复值的

有一点想不通,现在程序之所以更新这么快,无外乎就是让人有更多更快的方法来解决问题,什么都不要不是又回到石器时代,这种面试题个人认为没什么意义,条条道路通罗马,只要你能找到更快更好的方式就是最棒的 --------------------编程问答-------------------- Linq方法:
This sample uses Distinct to remove duplicate elements in a sequence of factors of 300.

 public void Linq46()
{
    int[] factorsOf300 = { 2, 2, 3, 5, 5 };
    var uniqueFactors = factorsOf300.Distinct();
    Console.WriteLine("Prime factors of 300:");
    foreach (var f in uniqueFactors)
    {
        Console.WriteLine(f);
    }
}
Result

Prime factors of 300:
2
3
5

http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#distinct1 --------------------编程问答-------------------- ............
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,