还记得昨天的第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,哎,还能说什么呢?(难怪今天没接到面试通过的电话,呵呵)
转载于:https://www.cnblogs.com/roogeer/archive/2007/12/19/1005189.html
相关资源:数据结构—成绩单生成器