今天参加了北京的一个知名公司的笔试,老板是清华大学的,出题的人是个据说搞了20多年coding的人,他自称还不是工匠。题目摘选:1.没有人爱每个人;牛郎爱织女;织女爱每个爱牛郎的人。
则不可能为真的是:
a.牛郎爱每个人  b.每个人爱一些人  c 织女不爱牛郎
2.现有N的阶乘,如果结果有多个0,则返回2,要求用效率最高的方式3.对字节变量,其二进制表示法中求有多少个1,如 00101010则返回值为 3,也是要求效率最高4.有S1,S2字符串,S1经过循环移位后,若包含S2则返回真,如S1=AABCD S2=CDAA 则为真,如S1=ACDB S2= CDA,则返回false,要求效率最高5.另有
public class A
{
 METHOD B()
{.... //执行代码
 sleep(5000);
method b();
}}
是否会每隔5秒,永远执行下去,如不能,最可能发生的问题是??还有5道题,下次再续, 这些题基本在网上没见过,据称他们公司开出的最高薪水为 2.5万,高手们来试试吧,我是没戏了!!
}

解决方案 »

  1.   

    4、用s3=s1+s1  ,s2在s3中就返回true。。要注意s2的长度要小于s1。。大于等于s1的直接判断就OK了。
      

  2.   

    1.a2.
    bool Have2Zero(int n)
    {
        if (n.ToString().Length - n.Tostring().replace("0", "").Length >= 2)
            return true;
        return false;
    }
    3.
    int HaveOne(byte n)
    {
        return n.ToString().Length - n.ToString().Replace("1", "").Length;
    }4.意思没看明白,貌似挺简单5.内存不够
      

  3.   

    这些题难度不大, 实际上, 那几个顶级公司, MS, Google, Oracle, baidu等, 笔试题都比这些难.
      

  4.   

    对问题3 我不知道这两个方法那个高
    1: 转换成位数组,循环,计数
    2:转换成字符串,REMOVE走“0” 然后取长
      

  5.   

    第一题,应该是a吧……没有人爱每个人,牛郎爱每个人,除非牛郎不是人……
    第二题,大于等于10的数的确其阶乘里面肯定会有两个以上的0,但7!=5040,8!=40320,这俩也得考虑进去吧……所以我觉得应该是判断N大于6且N不等于9……
    第三题,说实话效率最高的貌似是用汇编……直接用shl指令左移八次,每次移后判断标志位就行了吧……貌似即使用汇编,关键代码也就四五行就够了……
    第四题,想不出什么特别好的方法……题目挺简单,但要想效率最高,感觉还得好好想想算法……
    第五题,肯定不会一直执行下去,最后应该是内存爆了……
      

  6.   

    补充:第四题,把s1复制成两个,前后接起来,构成s1',然后判断s2是否是s1'的子字符串……
      

  7.   

    效率的不会,只能给点可行的算法...可能有问题,大家帮忙看看~1. a2.        public static long P2(long n)
            {
                if (f(n) % 100 == 0)
                    return 2;
                else
                    return n;
            }        public static long f(long n)
            {
                if (n == 1|| n == 0)
                    return 1;
                else
                    return n * f(n - 1);
            }
    3.        public static int P3(string str)
            {
                string str1 = str;
                str1 = str1.Replace("1", "");
                return str.Length - str1.Length;
            }
    4.        public static bool P4(string str1, string str2)
            {
                for (int i = 0; i <= str1.Length - 1; i++)//以str1长度做循环
                {
                    if (str1[i] == str2[0])//一旦首字母相等,才进行比较
                    {
                        int j = 0, k = i;//j指向str2, k指向str1                    while(j <= str2.Length - 1)//以str2长度做循环
                        {
                            if (str2[j] == str1[k])//逐个比较
                            {
                                j++;//str2正常递增                            //str1循环递增
                                if (k == str1.Length - 1)
                                    k = 0;
                                else
                                    k++;
                            }
                            else
                                break;//一旦不相等,跳出此次比较
                        }
                        if (j == str2.Length)//若比较是进行到最后,则说明子串已相等,返回真;若是跳出的,则不成立,不返回结果,继续~
                            return true;
                    }                
                }
                return false;
            }
    5. throw: 内存溢出
      

  8.   


    s1 = abc  
    s2 = abcabcabcacb这个也返回true的应该,Lz貌似讲s1是循环的...
      

  9.   


    lz说的s1是循环移位,应该不是不断循环长下去吧……
    不过提醒我了,的确应当先判一下s1是不是比s2长,不是的话应该直接返回false……
      

  10.   

    [Quote=引用 28 楼 wryse 的回复:]
    引用 26 楼 yoyoalphax 的回复:
    引用 24 楼 wryse 的回复: 
    补充:第四题,把s1复制成两个,前后接起来,构成s1',然后判断s2是否是s1'的子字符串…… 
    s1 = abc  
    s2 = abcabcabcacb 这个也返回true的应该,Lz貌似讲s1是循环的... 
     lz说的s1是循环移位,应该不是不断循环长下去吧…… 
    不过提醒我了,的确应当先判一下s1是不是比s2长,不是的话应该直接返回false…不是循环移位
      

  11.   

    同意。
    private int test(char ch)
    {
    int count=0;
    for(int i=7;i>=0;i--)
    {
    count+=(ch&(1<<i))==0?0:1;
    }
    return count;
    }不知这样写效率如何
      

  12.   

    本来是想搜索一个数的二进制表示的第一个1所在的位数,没想到误闯到C#版面来了。第三题,以前见过,C++的写法是
    while (n)
    {
        n &= n-1;
        ++count;
    }
    有几个1就循环几次,一次都没有浪费,应该是最快的方法了。
      

  13.   

    1、A
    2、上10以后下个数的个位是5或者0的返回2;
    3、往内存上排吧;
    4、我悟性不够,没看懂;
    5、你以为递归不要资源的啊,当然越来越慢,XP系统的话应该会提示循环冗余;
      

  14.   

    1:A2:计算N阶乘,但是只计算个位,如果个位为0,那么计算十位(但是整体/10,也就是把十位当成个位继续计算)以此类推···4:S3=S1+S1+S1  如果S2在S3中就TRUE 不再则FALSE5:是输入错误还是就这样子的。貌似大小写都不对。。这个样子编译直接报错
      

  15.   


    借花献佛一下,这算法也是从别人那里看来的。最巧妙的地方在于它能除掉最后一个1,每执行一次n&=(n-1),就少掉最后一个1,所以就是几个1就循环几次。
      

  16.   

    3.
    int Count(int n){     int num = 0;     while(n > 0)     {         n &= (n-1);         num++;     }     return ++;}
      

  17.   

    第二题超简单,我的答案是:int HasTwoZero(int n)
    {
    return n>=10?2:1;
    }
      

  18.   

    总结一个
    1. A
    2. 
    int HasTwoZero(int n) 

    return n>=10?2:1; 

    3. 
    while(n &= (n-1)) count++
    4.本人认为是字符串匹配问题,这个都有经典算法
      

  19.   

    这个问题很容易阿
    www.ilikebook.com.cn有相关的书籍