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

zuocg 2009-02-24 10:30:35
去除一个数组中的重复值,要求:不能使用“借助临时数组或新生成另一个数组”的方法,也不能使用某些函数库中提供的功能。请各位大侠指教。用C#语言实现。多谢!!!
...全文
530 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
JOCLI 2010-01-24
  • 打赏
  • 举报
回复
不知道用哈希表算不算
利用
try{}
catch{}
一个循环就完了,根据哈希表的特性,用KEY值是不能塞进重复值的

有一点想不通,现在程序之所以更新这么快,无外乎就是让人有更多更快的方法来解决问题,什么都不要不是又回到石器时代,这种面试题个人认为没什么意义,条条道路通罗马,只要你能找到更快更好的方式就是最棒的
guanning001 2010-01-24
  • 打赏
  • 举报
回复
............
ww0219 2010-01-24
  • 打赏
  • 举报
回复
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
gghlkk 2010-01-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 aimeast 的回复:]
自己写个排序,就可以了。

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

[/Quote]

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


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

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

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

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

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

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

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

很明显 直接遍历就能搞定的事情 为什么一再强调要排序
leafold 2010-01-23
  • 打赏
  • 举报
回复
最简算法,利用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();
}
beckham2537 2010-01-23
  • 打赏
  • 举报
回复
用ArrayList排序,然后光比较相邻的就可以
aimeast 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 zuocg 的回复:]
感谢大家的回复!我也感觉奇怪,普通的数组,重复的元素要如何去掉呢?!请高手们帮忙,是否有其他解法?
TO:aimeast,这位高人,你看清题目要求,不要懂点皮毛就到这胡说一通,难道这么多专家都不如你?你要行,你就把实现写出来!别废话连篇的。
[/Quote]

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

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

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

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

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

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

现在大多的程序员,基本功一点也不扎实!
止戈而立 2009-02-26
  • 打赏
  • 举报
回复
//写一个将重复数字放到最后的方法:
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

除了重复的数字被放到最后外,其他数字顺序不变。
zuocg 2009-02-25
  • 打赏
  • 举报
回复
多谢 holydsj 的回复。现在看来,确实是有可能这道题出的有问题。
没落鬼族 2009-02-25
  • 打赏
  • 举报
回复
哎呀,糟了

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

主要是对去除重复值的不同理解,如果同意我的理解的话,我相信楼主应该也能写自己满意的答案了。
yanyun54321 2009-02-25
  • 打赏
  • 举报
回复
我是猎头公司的angel,目前有.net的相关需求,要求有5年以上的c#.net的相关经验,英文能进行英文面试,base:上海
感兴趣的请联系我
email:angel@jingjie-wisemen.com
msn: angel_lu@live.hk
没落鬼族 2009-02-25
  • 打赏
  • 举报
回复
不能使用“借助临时数组或新生成另一个数组”
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~
zuocg 2009-02-25
  • 打赏
  • 举报
回复
感谢大家的回复,还有没有更好的办法。大家的办法,我感觉好像不是很符合题目的初衷!
wanghui0380 2009-02-24
  • 打赏
  • 举报
回复
呵呵,不用某些库,指的是啥??

14楼算最符合题意,不过str.Contains(),String.Join(),算不算用了某些库呢??
aimeast 2009-02-24
  • 打赏
  • 举报
回复
自己写个排序,就可以了。

我真的发现相当多的程序员都不懂算法和数据结构
chinesesword 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zuocg 的回复:]
感谢大家的回复,其实他给了一个数组int a[]={1,4,2,4,8,2,34,5,8,9}。就是一个普通数组,所以不能用ArrayList。请各位帮忙想想,多谢
[/Quote]
那这个重复值是置成某个特殊值?还是彻底去掉? 如果是彻底不要 就一个破同数组还挺有难度的!
zuocg 2009-02-24
  • 打赏
  • 举报
回复
感谢大家的回复,其实他给了一个数组int a[]={1,4,2,4,8,2,34,5,8,9}。就是一个普通数组,所以不能用ArrayList。请各位帮忙想想,多谢
iwxiaot 2009-02-24
  • 打赏
  • 举报
回复
转换成INT型数组,再用符号标志法
路人乙e 2009-02-24
  • 打赏
  • 举报
回复
注意条件:是数组不能使用某些函数库中提供的相关功能


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);
MoQi_123 2009-02-24
  • 打赏
  • 举报
回复
要用递归。

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);
}
加载更多回复(31)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧