请看:自作聪明,反被聪明误

回顾C#程序员面试经历,探讨不用第三个变量交换a,b值的方法及数组随机化与排序的实现,解析因细节疏忽导致的问题。

还记得昨天的第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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值