还记得昨天的第1次C#程序员面试吧,
第4题:不用第3个变量,交换a,b变量的值
这个题目我当时没解出来,但我写了一个方法的框架,如下:
public class TEST4
{
public static void Exchange(ref int a, ref int b)
{
//当时没做出来,下面的代码是网上的
//a = a ^ b;
//b = a ^ b;
//a = a ^ b;
}
}
第5题
1、申明容量为100的int型数组,将1--100随机放入其中,不得重复
2、对该数组进行排序,可按升序和降序排列。
看到第1问时,心里一喜(放松了严谨性,埋下了祸根),明白这一题需要一点小技巧,不能真的产
生1--100之间不重复的随机数值放入数组中(真那么做也不是不行,但效率很低),可以把1--100
事先写入数组中,产生100次1--100的随机数,表示一个“位置”,与当前的数组位置交换值就行了,
程序循环100次就OK了。思路有了,代码就好写了:
public class MyArray
{
private int[] mArray;
public MyArray()
{
mArray = new int[100];
}
public void Init()
{
//处理第一问
//顺序写入1--100到数组中
for(int i = 0; i < 100; i++)
mArray[i] = i + 1;
Random rnd = new Random();//初始随机数
//产生100次新的位置
int pos;
int j = 0;
while(j < 100)
{
pos = rnd.Next(0, 99);//位置值在0--99之间
TEST4.Exchange(ref mArray[j], ref mArray[pos]);//<==就是这里,自作聪明
j++;
}
}
}
自以为聪明,想到刚考了交换变量的,如果不复用,会被扣分吧?(心里暗喜,这才是真正的考点吧,
于是调用第4题的TEST4.Exchange()方法,不用说,第2问的排序,也毫不犹豫的调用了该方法。
今天闲来无事,把上面的代码跑了一遍,顿时目瞪口呆,结果有问题!数组中产生了数据0!!!,一
番跟踪调试,终于搞清楚原因了:当随机产生的pos值和当前的j值相等时,就出问题了,调用
TEST4.Exchange(ref mArray[j], ref mArray[pos])时,两个地址实际上是同一个地址,结果使数据置
为0,哎,还能说什么呢?(难怪今天没接到面试通过的电话,呵呵)