Spiga

让人懊恼的面试-看程序员的基本功

2008-10-31 21:19 by guojing, 3383 visits, 网摘, 编辑

今天去参加了微软的一个外包的公司的招聘,当然,这个招聘的公司不在国内,不过好在出人意料的是这个公司竟然在武汉来招聘了,我的一个非常优秀的c++的朋友被应聘了,然后他极力推荐我去参加应聘,我第一次去,那个boss(老外)非常赞赏我,因为我的简历的原因,原来做了Shangducms这个项目并且还出了一本书,所以那个老外非常赞赏我,并且直接安排我到最后的面试。

话说回来,这个老外是一个hr,但是是微软的员工并且长达10年的工龄,这个老外对算法和素质要求的比较高(其实国外的公司都差不多是这样),然后这个老外出了两个题,一个题是编程题,另一个是设计题,这两个题在各位高手眼中肯定比较简单,这两个题是这样的。

1.对字符串进行排序,用任意一种编程语言来实现,不能使用现有的类,在排序中,字符串“Bc”,“Ad”,“aC”,“Hello”,“X man”,“little”,“During”,“day”能够排序成“Ad”,"aC",“Bc”,“During”,“day”,“Hello”,“little”,“Hello”,也就是说,在排序的过程并不是传统的按照字符串排序,在排序中还需要将小写字母一并排序,也就是说a字符串要在B或b之前。

2.设计一个图书管理系统,无需实现,只需要写清思路就可以了。

考试也很轻松,出了不能用QQ,MSN以外,其他的什么baidu啊google啊都可以查,本来拿到这两个题的时候觉得非常的简单(当时的感觉那是相当的简单),但是没想到做了2-3个小时还没有做出来,要不就是出现错误要不就是无法排序,结果只好被老外说“I'm sorry”了。

后来回来了之后,感觉非常的郁闷,其实也不是特别郁闷,但是觉得自己水平不错嘛,这样的工作当然是唾手可得了,没想到马失前蹄,感觉不爽,就和朋友玩了几个小时游戏,后来坐回电脑前,改不了程序员的“劣根性”,非要搞出个所以然来,结果没出20分钟就搞定了,真是很郁闷!因为如果做不出来就算了,结果自己做20分钟就做出来了,在面试时却没有做出来,我想除了紧张以外,更多的还是基础知识不牢固的原因,下面分享一下自己的代码。

其实第一题很简单,就是一个排序,随便用什么算法都可以,直接冒泡就可以,不过难点在于比较字符串中间的字符的ASCII的值,首先写其他代码,初始化一下,示例代码如下所示。

        public string[] str = { "dad""bood","bada","Admin","Good","aete","cc","Ko","Beta","Could"};
        
public Form1()
        {
            InitializeComponent();
        }

        
private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text 
= "";
            
for (int i = 0; i < str.Length; i++)
            {
                textBox1.Text 
+= str[i].ToString()+" ";
            }
        }

 

上面这串代码很简单,就是先声明一个数组咯,然后在窗体加载时进行数组的遍历(原题是从文件中读取一串字符串转化为数组,这个简单,固可以忽略),当用户单击排序按钮时,进行排序,这里也很简单,示例代码如下所示。

Code

 

当用户单击按钮时,使用排序Sort方法排序字符串然后清空现有的内容再呈现在控件中,这里关键的就是Sort方法的实现,Sort方法的实现很简单,直接冒泡就可以了,但是注意的是,这里是字符串,而不是数字,冒泡的话需要判断大小,如果使用C#函数,则可以很容易的实现Sort方法,示例代码如下所示。

Code

 

好了,如果使用String.CompareOrdinal方法当然能够快速的排序,但是这里有一个问题,先不说这里不能用自带的类,就说这个题目吧,CompareOrdinal方法还是无法实现需求,但是这里给了一个思路,使用冒泡排序进行排序,可以在函数中实现字符串的大小的对比,就好像数字的对比一样,这里就该一下,使用自己的方法,示例代码如下所示。

Code

 

上面的代码使用自己的compare方法进行判断,其实现思路基本同String.CompareOrdinal相同再加以改进就可以了,这是最重要的方法,因为这个方法直接关系到排序,示例代码如下所示。

 

Code

 

在进行compare方法的实现时,首先要确定思想,对字符串进行排序,首先要判断两个字符串的第一个字母的ASCII码,如果相等,就判断字符串的下一个字母的ASCII,以此类推,但是这里注意的是a的ASCII要比Z要大,所以在判断前还需要判断是否为小写字母(这里的方法比较蠢,呵呵),如果是小写,转换成大写进行判断,同样为了实现String.CompareOrdinal方法的效果,可以返回一个int类型的值进行判断.

 这样,整个排序就完成了,做完之后,我自己真的是感慨良深啊,自己做了多年的.NET开发,却真正意义上并不太懂How the Program Works,老外在最后也对我说了“虽然你懂很多ASP.NET,WCF,WPF等等知识,但是最基础的却掌握的不好,相比之下,我建议你在这几个月的时间里多学习一下基础,当你的基础牢固了之后,一切都变得简单了(Everything gonna to be easy)”,确实,当时做不出来最郁闷的并不是题目本身,而是忽然感觉到自己学习的过程有点像揠苗助长一样,应用做多了,反而基本的都忘记了。

其实,这篇文章并不是最出彩的文章,也不是技术含量最深的文章,而且这个题目肯定有很多高手看一眼就能够做出来,但是我写这篇文章,只是想分享一下自己的经历,真的,其实越到后来越发现,基础往往是最重要的,这让我想起几个月前讨论的基础是不是最重要的话题时,很多人都说只要工作的时候翻翻书就可以了,当时我也是这么想,想着不会了翻书找一下就行了,没想到优秀是一种习惯,熟练的掌握基础才是编写高质量代码的基本要求。

最后在这里分享一下一点总结:

1.面试千万不要紧张,特别是face to face的时候,还特别是老外面试,千万不要紧张,否则水平还没有平时的十分之一。

2.多多锻炼一下自己的基本功,无论是在校学生(像我还有几个月时间),还是上班的同学(我也工作了几年),都应该好好把握时间多练习基本功,在校生有很多的机会可以练,而参加工作的同学也需要“温故而知新”。

3.优秀是一种习惯,无论是在解决问题上还是在编码风格上,都应该按照最好的标准要求自己(老外还说看代码主要是要看风格)。

最后在文章的结尾希望能够和各位高手一起分享Code的乐趣和经验。

分享一句不想关的话,人本是人,不必刻意去做人,世本是世,无须精心处世。

Add your comment

67 条回复

  1. #1楼 mmic.net.cn      2008-10-31 21:33
    大不了得头再来,很多事,大家都没有遇到过,不能说别人不给机会,而是有些人招人是按自己的逻辑走的。
      回复  引用  查看    
  2. #2楼[楼主] guojing      2008-10-31 21:34
    @mmic.net.cn
    啥意思?
      回复  引用  查看    
  3. #3楼 mmic.net.cn      2008-10-31 21:34
    我这几天的面试给我的感觉是,不论你的技术再N比,哪方面再专长,别人不会看,更不会深问,只会说你缺点呵呵,习惯就好 好像你越不懂什么,人家就越问什么?
      回复  引用  查看    
  4. #4楼 犇牛牛      2008-10-31 21:35
    呵呵 碰见这种题目没有做出来是满郁闷 纯粹的算法
    只需要将小写字母的ASCII码减个31.5 用double值来比较就可以吧
      回复  引用  查看    
  5. #5楼[楼主] guojing      2008-10-31 21:35
    呵呵 怎么说呢 别人再怎样 先从自己身上找原因咯
      回复  引用  查看    
  6. #6楼[楼主] guojing      2008-10-31 21:36
    @犇牛牛
    是啊 回家后20分钟就搞定了 当时真不知道怎么搞的 懵了 :)
      回复  引用  查看    
  7. #7楼 未登录的xiaotie[未注册用户]2008-10-31 21:47
    private int compare(string str1, string str2)
    这个方法问题还多啊。
      回复  引用    
  8. #8楼 WCF技术联盟      2008-10-31 22:16
    老美笔试的时候喜欢靠算法,我领教过。
      回复  引用  查看    
  9. #9楼 Evernory      2008-10-31 22:19
    外包实在没有什么做的。
      回复  引用  查看    
  10. #10楼 谢小漫[版版的][未注册用户]2008-10-31 22:20
    第一题可以考虑一下测试驱动开发。
    把所有想到的用例都出来了:应该就不会
    >>2-3个小时还没有做出来
    逐步分解比较好玩。
      回复  引用    
  11. #11楼[楼主] guojing      2008-10-31 22:21
    @谢小漫[版版的]
    领教一下测试用例开发 :) 改怎么做呢
      回复  引用  查看    
  12. #12楼[楼主] guojing      2008-10-31 22:21
    @Evernory
    至少比国内的很多公司都好,他们公司的人直接可以在微软办公
      回复  引用  查看    
  13. #13楼 rab63[未注册用户]2008-10-31 22:23
    代码是智慧延伸,项目与产业才是智慧之塔
      回复  引用    
  14. #14楼 Justin      2008-10-31 22:26
    面试很多时候就是一种机遇,成功了并不代表你就是成功的,只是这次够幸运,失败了也不代表你有多糟糕,只是你这次不走运而已。
    不过基本功肯定很重要,上次换工作参加过几次笔试,总体感觉是越专业的公司题目反而越基础。
      回复  引用  查看    
  15. #15楼 kunkun      2008-10-31 22:35
    @Justin
    说得没错,面试其实也是有点运气在里面的,当然是在你有实力的基础建立。基础是非常重要的啊。
      回复  引用  查看    
  16. #16楼 Birdshover      2008-10-31 22:48
    说好不能用已有类的,你的算法还是用了String类的比较方法,试试这个

    static unsafe void Main(string[] args)
    {
    string[] source = new String[] { "Bc", "Ad", "aC", "Hello", "X man", "little", "During", "day" };
    int ptr = 0;
    bool changed = false;
    while (true)
    {
    if (ptr < source.Length - 1)
    {
    string nowstr = source[ptr];
    string nextstr = source[ptr + 1];
    int count = nowstr.Length > nextstr.Length ? nextstr.Length : nowstr.Length;
    for (int i = 0; i < count; i++)
    {
    char a = nowstr[i];
    char b = nextstr[i];
    if (CompareChar(a, b) > 0)
    {
    source[ptr + 1] = nowstr;
    source[ptr] = nextstr;
    changed = true;
    break;
    }
    else
    break;
    }
    ptr++;
    }
    else
    {
    if (!changed)
    break;
    ptr = 0;
    changed = false;
    }
    }

    for (int i = 0; i < source.Length; i++)
    {
    Console.WriteLine(source[i]);
    }

    Console.ReadKey();
    }

    static int CompareChar(char a, char b)
    {
    if (a == b)
    return 0;
    if (a == ' ' && a != b)
    return -1;
    if (b == ' ' && b != a)
    return 1;
    int anum = 0;
    int bnum = 0;
    if (a >= 'a')
    anum = a - 'a';
    else
    anum = a - 'A';
    if (b >= 'a')
    bnum = b - 'a';
    else
    bnum = b - 'A';
    if (anum > bnum)
    return 1;
    else if (anum == bnum)
    {
    if (a > b)
    return 1;
    else if (a == b)
    return 0;
    else
    return -1;
    }
    else
    return -1;
    }
    }
      回复  引用  查看    
  17. #17楼 Cat Chen      2008-10-31 22:52
    第1题很简单啊,String.Compare加上List<T>.Sort就能完成,现在的唯一问题是你要自己实现一次String.Compare和List<T>.Sort。你还是按照使用String和List<T>的方法去写主逻辑,然后再写实现细节,那就行了。

    可能随手写一个quick sort不那么容易,那就写一个冒泡咯。最终要的还是分层的思想,你自己写的排序不是接受T和comparor,这就能看出思想上的差别了。好好理解一下为什么应该接受T和comparor吧。如果我是面试官,我会希望你用T和comparor的写法。
      回复  引用  查看    
  18. #18楼 傻蛋[未注册用户]2008-10-31 22:52
    有这么复杂吗,直接转成大写字符串比较不就行了。楼主当时肯定是进水了。
      回复  引用    
  19. #19楼 JustForKim      2008-10-31 23:24
    Cat Chen 的讲法不错,我想起我一个同事开发DB2的权限管理系统,直接就是借鉴FW2.0里membership的架构,自己实现这些类的操作就ok了。
    做不给使用framework的数据结构题时,我们可以借鉴一下framework里类的结构,实现这些类的接口就是。微软已经提炼出数据结构类的架构了,我们为什么不用它呢。
      回复  引用  查看    
  20. #20楼 binglingshui      2008-10-31 23:33
    我也去过微软面试,讲了一堆的WCF,ORM...,结果给了相同的一句话,你说的那些东西我们用不到。
    呵呵。苦心练了一个月的数据结构。
      回复  引用  查看    
  21. #21楼[楼主] guojing      2008-10-31 23:43
    @Cat Chen
    我也想用List再Sort啊 可惜连List都不能用
    @Birdshover
    你是不是看错了?我没用现有的类啊..不过(int)这类的转换还是能够用的
      回复  引用  查看    
  22. #22楼[楼主] guojing      2008-10-31 23:44
    @傻蛋
    你可以做一做 直接转换成大写字符串比较步骤反而还多了一步 不是吗..而且 还要再实现一个 转换为大写的方法
      回复  引用  查看    
  23. #23楼[楼主] guojing      2008-10-31 23:46
    @JustForKim
    @Cat Chen
    我非常同意你们的说法,我也是这样做的,可是,既然不让用,非得用原始的方法,List肯定不能用的,当然我们大家都知道用List排序几乎不费吹灰之力。
      回复  引用  查看    
  24. #24楼 大菜鸟      2008-11-01 00:16
    楼主后面几句话说的不错
      回复  引用  查看    
  25. #25楼 robi      2008-11-01 00:19
    显然您的private int compare(string str1, string str2)不能满足要求。
      回复  引用  查看    
  26. #26楼 robi      2008-11-01 00:30
    比较规则是:1.相同字母且大小写相同则相等。2.相同字母但大小写不同大写字母比小写字母小。3.不同字母不管大小写都转换成大写或者小写进行ASCII码比较。

    static int Compare(string string1, string string2)
    {
    int i1;
    int i2;
    int lenght = string1.Length < string2.Length ? string1.Length : string2.Length;

    for (int i = 0; i < lenght; i++)
    {
    i1 = (int)string1[i];
    i2 = (int)string2[i];

    //相同字母比较下一个.
    if (i1 == i2)
    {
    continue;
    }
    else
    {
    //都转换成大写字母
    if (i1 >= 97)
    {
    i1 = i1 - 32;
    }

    if (i2 >= 97)
    {
    i2 = i2 - 32;
    }
    //相同字母大写比小写小
    if (i1 == i2)
    return (int)string1[i] > (int)string2[i] ? 1 : -1;
    else
    return i1 > i2 ? 1 : -1;
    }
    }

    if (string1.Length > string2.Length)
    return 1;
    else if (string1.Length < string2.Length)
    return -1;
    else
    return 0;
    }
      回复  引用  查看    
  27. #27楼 ξσ Dicky σξ      2008-11-01 00:42
    面试总是出这些无聊的题目,烦死人了
      回复  引用  查看    
  28. #28楼 asboy      2008-11-01 02:19
    呵呵 "baidu啊google啊都可以查" 那应该就不难了

    楼主当时心情紧张了吧

    还需要点运气噢
      回复  引用  查看    
  29. #29楼 Gary Zhang      2008-11-01 06:50
    两点感触:基础很重要,优秀是一种习惯。
      回复  引用  查看    
  30. #30楼[楼主] guojing      2008-11-01 08:34
    @robi
    谢谢 还是考虑掉了一种情况 就是相同字母的大写和小写比 其他的都考虑了 这个其实无所谓 不过还是谢谢了 : )
      回复  引用  查看    
  31. #31楼[楼主] guojing      2008-11-01 08:38
    @robi
    现在我将自己的代码修正了一下 可以了 感谢你的指点 其实和你的实现差不多
      回复  引用  查看    
  32. #32楼 Kevin Zou      2008-11-01 09:03
    static bool isGreater(string aStr,string bStr)
    {
    int cmpCount = aStr.Length>bStr.Length?bStr.Length:aStr.Length; //compare count,set the shorter one
    for(int i=0;i<cmpCount;i++){
    if(i==0 && aStr[i]!=bStr[i]){
    return (aStr[i]>=96?aStr[i]-32:aStr[i]) > (bStr[i]>=96?bStr[i]-32:bStr[i]);
    }
    else if(aStr[i]!=bStr[i])
    return aStr[i]>bStr[i];
    }
    return aStr.Length>bStr.Length; //blanket is the minimum
    }

    public static void Main()
    {
    string[] srcArr = new string[]{"Bc","Ad","aC","bCa","bCD","Hello","X man","little","During","day","bCd"};
    string tmp = "";
    //direct insert
    for(int i=1;i<srcArr.Length;i++){
    tmp = srcArr[i];
    int j=i-1;
    while(j>=0){
    if(isGreater(srcArr[j],tmp))
    srcArr[j+1] = srcArr[j];
    else
    break;
    j--;
    }
    srcArr[j+1] = tmp;
    }
    foreach(string item in srcArr){
    WL(item);
    }
    RL();
    }
      回复  引用  查看    
  33. #33楼 说什么好呢[未注册用户]2008-11-01 09:18
    不是打击你,还自我感觉良好呢,这样的题目都做不出来,说明你的基本功相当不扎实,无论什么时候基本功才是最重要的,还是扎扎实实学习、锻炼吧,如果你要成为一个程序员或者更高发展

    心里素质是一个更高层次的问题,她的提高是以前面为前提的,别忘了艺高人胆大!!!!!
      回复  引用    
  34. #34楼 BoyLee      2008-11-01 10:22
    呵呵
      回复  引用  查看    
  35. #35楼 hellofox2000[未注册用户]2008-11-01 10:26
    还有一个问题是:没有面试时尝试的那2到3个小时,后面你能用20分钟做出来做不出来还是个问题。虽然短,但我也认为这就是一个积累的过程
    很多情况就是这样:在规定的约束下,在约定的环境完成特定的需求。
      回复  引用    
  36. #36楼 路人丁[未注册用户]2008-11-01 10:38
    这俩题一个计算机大一的学过c语言做过课程设计的都会,楼主显然是紧张的找不到北了,没关系,多锻炼下心理素质就可以了。这个不能说是基础,这两题的考察范围最多应该属于程序员的常识
      回复  引用    
  37. #37楼 Goumh      2008-11-01 11:28
    这种现象很正常,且不说是面试,而且是向往已久的一个大公司的面试,进门之前,可能心跳就开始加速,已经有点找不着北了。
    就连央视名嘴,看起来在镜头前很光鲜,很流利,然而如果遇到春晚啊,或者更大的现场直播,那应该是久经沙场了,他们有时还紧张得不行,说错话,读错字,还是经常的事呢,何况我们平民百姓。

      回复  引用  查看    
  38. #38楼 w3c==garbage[未注册用户]2008-11-01 11:34
    --引用--------------------------------------------------
    说什么好呢: 不是打击你,还自我感觉良好呢,这样的题目都做不出来,说明你的基本功相当不扎实,无论什么时候基本功才是最重要的,还是扎扎实实学习、锻炼吧,如果你要成为一个程序员或者更高发展

    心里素质是一个更高层次的问题,她的提高是以前面为前提的,别忘了艺高人胆大!!!!!
    --------------------------------------------------------
    呵呵 这位说的语气不太客气 其实还是有道理的

    排序这题其实很不错
    既能看算法 又能看设计能力

    排序虽然简单 但是各层次的都有 从最基本的冒泡 到高级一点的快速排序 归并 希尔 如果你有本事写个混合排序 Introspective Sorting之类的 估计面试官都会服了你

    设计上 熟悉C语言的肯定喜欢传个比较函数Compare进去 传统OO的爱好者可以让对象实现个Sortable接口 接口里面放Compare。 hard code的Compare是最差选择

      回复  引用    
  39. #39楼 osoft1983      2008-11-01 11:55
    "微软的一个外包的公司..."关系好远...
      回复  引用  查看    
  40. #40楼 乐乐_汪      2008-11-01 11:56
    --引用--------------------------------------------------
    犇牛牛: 呵呵 碰见这种题目没有做出来是满郁闷 纯粹的算法
    只需要将小写字母的ASCII码减个31.5 用double值来比较就可以吧

    --------------------------------------------------------

    果然这样可以
    class Program
    {
    static void Main(string[] args)
    {
    string[] toSort = new string[] { "Bc", "Ad", "aC", "Hello", "X man", "little", "During", "day" };
    Sortable(toSort );
    foreach (string s in toSort)
    {
    Console.Write(s+" ");
    }
    Console.ReadKey();
    }

    public static void Sortable(string[] a)
    {
    for (int i = 0; i < a.Length; i++)
    {
    for (int j = i + 1; j < a.Length; j++)
    {
    if (compareStr(a[i], a[j]))
    {
    string t = a[i];
    a[i] = a[j];
    a[j] = t;
    }
    }
    }

    }
    public static bool compareStr(string a, string b)
    {
    double cha = Convert.ToInt16(a.ToCharArray()[0]) ;
    double chb = Convert.ToInt16(b.ToCharArray()[0]);
    if (cha > 96)
    {
    cha = cha - 31.5;
    }
    if (chb > 96)
    {
    chb = chb - 31.5;
    }


    if (cha > chb)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    }
      回复  引用  查看    
  41. #41楼[楼主] guojing      2008-11-01 12:02
    @osoft1983
    也不是很远 说是外包 但是其公司的人都在微软内部工作
      回复  引用  查看    
  42. #42楼[楼主] guojing      2008-11-01 12:02
    @乐乐_汪
    好像真的可以 呵呵 不过我自己的也可以的啊 :)
      回复  引用  查看    
  43. #43楼[楼主] guojing      2008-11-01 12:03
    @说什么好呢
    谢谢您的提醒
      回复  引用  查看    
  44. #44楼 边城浪1[未注册用户]2008-11-01 12:56
    class Program
    {
    public static string[] str = { "dad", "bood", "bada", "Admin", "Good", "aete", "cc", "Ko", "Beta", "Could" };
    static void Main(string[] args)
    {

    for (int j = 0; j <str.Length; j++)
    {
    bool chage = false;
    for (int i = j + 1; i < str.Length; i++)
    {
    int result = Sort(str[i], str[j]);
    if (result < 0) //交换
    {
    string temp = str[i];
    str[i] = str[j];
    str[j] = temp;
    chage = true;
    }
    Console.WriteLine(result);
    }
    if (!chage) break;
    }
    Console.Read();
    }

    public static int Sort(string a, string b)
    {
    int len = Math.Min(a.Length, b.Length);
    for (int i = 0; i < len; i++)
    {
    int ai = a[i] - 'Z'-1;
    int bi = b[i] - 'Z'-1;

    if(ai*bi<0) //一个大写.一个小写
    {
    if(ai<0)
    {
    ai+= 32;
    return ai>bi?1:-1;
    }
    else
    {
    bi+= 32;
    return ai>=bi?1:-1;
    }
    }
    //都是大写.或都是小写
    if (ai != bi)
    {
    return ai > bi ? 1 : -1;
    }
    }
    if (a.Length == b.Length)
    {
    return 0;
    }
    return a.Length > b.Length ? 1 : -1;
    }
    }
      回复  引用    
  45. #45楼 超级杀猪仔      2008-11-01 13:44
    没通过???
    太可惜了··那2东西简直是小儿科·
    你是应届生吧?
      回复  引用  查看    
  46. #46楼[楼主] guojing      2008-11-01 15:02
    @超级杀猪仔
    是应届的 呵呵
      回复  引用  查看    
  47. #47楼 怪怪      2008-11-01 15:13
    @Cat Chen
    那些似乎根本用不上多高理解能力吧...,如果思想都是如此直白的东西,也就不值什么钱了,知不知道、熟不熟练的某方面常识而已。面试不那么设计,也不代表工作中就不会那么设计;哪怕原来真不了解,接触一阵子也会有所体会。关键要考核的还是脑子是不是好使。如果我是老板,我会希望面试官不要把这些当做重点。
      回复  引用  查看    
  48. #48楼 kkee[未注册用户]2008-11-01 16:35
    基础还是很重要的,看看老外做的那些优秀开源软件,就知道人家的软件功力了。
      回复  引用    
  49. #49楼 凉凉de风      2008-11-01 16:55
    public static int CompareChar(char a, char b)
    {
    double _a = (double)a;
    double _b = (double)b;
    if (_a >= 97)
    _a -= 31.5;
    if (_b >= 97)
    _b -= 31.5;
    if (_a > _b)
    return 1;
    else if (_a < _b)
    return -1;
    else
    return 0;
    }

    public static int CompareString(string a, string b)
    {
    char[] _a=a.ToCharArray();
    char[] _b=b.ToCharArray();
    int temp;
    int result=0;
    int i = a.Length > b.Length ? a.Length : b.Length;
    for (int j = 0; j < i; j++)
    {
    if (a.Length>j&&b.Length>j)
    {
    temp = CompareChar(_a[j], _b[j]);
    if (temp != 0)
    {
    result=temp; break;
    }
    else
    continue;
    }
    else if (b.Length>j)
    {
    result = -1; break;
    }
    else
    {
    result = 1; break;
    }
    }
    return result;
    }

    static void Main(string[] args)
    {
    string temp;
    string[] str = { "dad", "bood","bada","Admin","Good","aete","cc","Ko","Beta","Could","ccc","dadd","AA","Aa","ae" };
    for (int i = 0; i < str.Length; i++)
    {
    for(int k=i+1;k<str.Length;k++)
    {
    if (CompareString(str[i],str[k]) == 1)
    {
    temp = str[i];
    str[i] = str[k];
    str[k] = temp;
    }
    }
    }
    foreach (string c in str)
    {
    Console.Write(c+',');
    }
    Console.ReadKey();
    }
      回复  引用  查看    
  50. #50楼 zqwuwei      2008-11-01 20:27
    我用asp写了个,是一个一个字母判断的。花了一个多小时,都是你的逻辑不清晰造成的。特别是做asp,总感觉自己是代码机器啊!
      回复  引用  查看    
  51. #51楼 zqwuwei      2008-11-01 20:29
    <%
    str="Bc,Ad,aC,Hello,X man,little,During,day"
    arr=Split(str,",")
    '行最大下标
    rLen=ubound(arr)
    '列最大下标
    cLen=len(arr(0))
    for i=1 to rLen
    if cLen<len(arr(i)) then
    cLen=len(arr(i))
    end if
    next

    cLen=cLen-1

    redim arr2(rLen,cLen)
    for i=0 to rLen
    for j=0 to cLen
    arr2(i,j)=mid(arr(i),j+1,1)
    next
    next
    response.Write("排序前:<br><hr>")
    for i=0 to rLen
    for j=0 to cLen
    response.Write(arr2(i,j)&",")
    next
    response.Write("<br>")
    next
    response.Write("排序后:<br><hr>")
    redim arrTemp(cLen)
    for i=0 to rLen
    for j=i+1 to rLen
    for k=0 to cLen
    if UCase(arr2(i,k))>UCase(arr2(j,k)) then
    for m=0 to cLen
    arrTemp(m)=arr2(i,m)
    arr2(i,m)=arr2(j,m)
    arr2(j,m)=arrTemp(m)
    next
    exit for
    elseif UCase(arr2(i,k))=UCase(arr2(j,k)) then
    if arr2(i,k)>arr2(j,k) then
    for m=0 to cLen
    arrTemp(m)=arr2(i,m)
    arr2(i,m)=arr2(j,m)
    arr2(j,m)=arrTemp(m)
    next
    exit for
    elseif arr2(i,k)<arr2(j,k) then
    exit for
    end if
    else
    exit for
    end if
    next
    next
    next

    for i=0 to rLen
    for j=0 to cLen
    response.Write(arr2(i,j))
    next
    response.Write("<br>")
    next
    %>
      回复  引用  查看    
  52. #52楼 zqwuwei      2008-11-01 20:30
    博客园的回复框该改进了。
      回复  引用  查看    
  53. #53楼 JustForKim      2008-11-01 20:52
    @guojing
    你理解错了 Cat Chen的意思,他是叫你自己实现list的sort方法和string的compare方法:
    class string
    {
    public int compare(string s)
    {
    //自己实现
    }
    }

    class list
    {
    private string[] str ;
    public list(string[] str)
    {
    this.str = str;
    }

    public string[] sort()
    {
    //自己根据string.compare()来实现对str的冒泡或快速排序
    }
    }

    class client{
    main()
    {
    list A=new list( { "dad", "bood","bada","Admin","Good","aete","cc","Ko","Beta","Could"});
    string[] result=A.sort();
    }
    }
      回复  引用  查看    
  54. #54楼 shawnliu      2008-11-02 02:34
    lz看来功底搭建太浅了 丢掉类库 自己练练算法和数据结构吧
    他出的题目的确很简单
      回复  引用  查看    
  55. #55楼 mVC noway[未注册用户]2008-11-02 13:31
    说题目简单的都是傻子!你能说你写出—说出的方法的是最好。
    你当人家面视的真的就会这么容易让你过去,动脑子好好想想,
    你能正确的执行你写的程序能说明什么,答案他其实早知道了,
    就看你怎么写出来,内功深厚是否这两题就足够了。
      回复  引用    
  56. #56楼 小华子      2008-11-02 15:54
    呵呵,这么多人讨论,我这个小菜鸟也插一嘴...
    我觉得楼主对这个字符串比较的算法处理还不是很完善:
    1.就对第一题的实现而言,确实是正确的,如果等你做完了,老外又在
    public static string[] str ={ “Bc”,“Ad”,“aC”,“Hello”,“X man”,“little”,“During”,"day" };这个数组中加两项,(比如:"Af","ag")
    根据你这种解法,最后的结果是:"Af","Ad”,"ag","aC",“Bc”,“During”,“day”,“Hello”,“little”,“X man”
    ^_^...你觉得这是老外想要的结果吗?

    2.楼主处理比较字符串的时候只对字符串的第一个字符进行了处理,如果字符串的第一个相等(都是大写或是小写)呢?并没有在此基础上,继续对下一字符的算法的比较处理。


      回复  引用  查看    
  57. #57楼[楼主] guojing      2008-11-02 16:09
    @小华子
    你说的对 这里我也懒得实现了 过一会我就实现一下 : ) 感谢你的提醒
    你不是小菜 肯定是高手
      回复  引用  查看    
  58. #58楼[楼主] guojing      2008-11-02 16:09
    @mVC noway
    确实,前面的人基本上没有完全作对的
      回复  引用  查看    
  59. #59楼 我一直是过客[未注册用户]2008-11-03 10:47
    我也发一个.

    string[] s={"hall","Cc","Black","Hello","ef","Kitty","cat","egg","Dd","And","Zerg","Egg","ball","all","ee","eE","all"};
    for(int i=0;i<s.Length;i++){
    for(int j=i+1;j<s.Length;j++){
    int ret=CompareString(s[i],s[j]);
    if(ret==1){
    string tmp=s[i];
    s[i]=s[j];
    s[j]=tmp;
    }
    }
    }



    foreach(string s1 in s){
    Console.Write(" "+s1);
    }
    Console.ReadLine();
    }

    //如果所有字符相等,返回0
    //如果s1="a...",s2="A...",返回1
    //如果s1="abd..",s2="abc...",返回1
    //如果s1="aa..",s2="aA...",返回1
    private static int CompareString(string s1,string s2){
    int L=s1.Length>s2.Length?s2.Length:s1.Length;
    for(int i=0;i<L;i++){
    char c=s1[i];
    char c2=s2[i];
    if(Math.Abs(c-c2)==32){
    if(c>c2){ //c=a,c2=A
    return 1;
    }
    return -1;
    }
    else{
    if(c-c2==0){
    continue;
    }
    else{
    if(c>=97) c=(char)((int)c-32);
    if(c2>=97) c2=(char)((int)c2-32);
    if(c>c2){
    return 1;
    }
    return -1;
    }
    }
    }

    return 0;

    }
      回复  引用    
  60. #60楼 施炯      2008-11-04 09:55
    哥们儿在武汉 难道是华中科技的
      回复  引用  查看    
  61. #61楼[楼主] guojing      2008-11-04 09:58
    @施炯
    我是分校的 有没有工作推荐 :)
      回复  引用  查看    
  62. #62楼 小猴子      2008-11-04 11:19
    2-3个小时做了这样的排序题目,
    不是你能力不行,估计是平时动手的时候少了!
    这说的这个就很说明问题啦:
    要不就是出现错误 == 手生
    要不就是无法排序 == 动手前没有相好,而是写到哪里算哪里。
      回复  引用  查看    
  63. #63楼 冰の酷龙      2008-11-09 11:39
    哈哈,突然发现看下了你的cms的项目,还用了下。我朋友还和你聊过。一晃又是半年了。。时间真快。
      回复  引用  查看    
  64. #64楼 fobid[未注册用户]2008-12-08 20:21
    其实你水平的确很差,看你的项目代码是在普通的出奇,兄弟不要太以自我为中心了~
      回复  引用    
  65. #65楼 aaaaaaaaaaa[未注册用户]2008-12-24 12:38
    看了你今天在首页上的播客,确实很佩服你,尤其是你的激情!

    但我觉得微软的面试要的不仅是能写出来,更需要最优。

    所以我个人觉得你不用觉得你的这次面试失利很可惜,因为即使你当初写了上面的这个冒泡排序,复杂度要O(n^2),估计也不一定能成功。

    保持你的激情,希望你能在受到挫折后依然保持你的激情,相信你会成功的。
      回复  引用    
  66. #66楼[楼主] guojing      2008-12-24 12:40
    @aaaaaaaaaaa
    谢谢你 激情是最重要的 :)
    我觉得无论是有什么挫折,都一定能够克服过去的,与你共勉吧
      回复  引用  查看    
  67. #67楼 pppppppppppppp[未注册用户]2009-03-02 09:37
    我在GOOGLE上面搜Microsoft.WindowsMobile.PocketOutlook 无意间进了你的博客,然后看到五字棋.....我怎么感觉像NEZSOFT????呵呵...个人感觉!!!
      回复  引用    
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1323971




相关文章:

相关链接: