今天参加了北京的一个知名公司的笔试,老板是清华大学的,出题的人是个据说搞了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万,高手们来试试吧,我是没戏了!!
}
则不可能为真的是:
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万,高手们来试试吧,我是没戏了!!
}
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.内存不够
1: 转换成位数组,循环,计数
2:转换成字符串,REMOVE走“0” 然后取长
第二题,大于等于10的数的确其阶乘里面肯定会有两个以上的0,但7!=5040,8!=40320,这俩也得考虑进去吧……所以我觉得应该是判断N大于6且N不等于9……
第三题,说实话效率最高的貌似是用汇编……直接用shl指令左移八次,每次移后判断标志位就行了吧……貌似即使用汇编,关键代码也就四五行就够了……
第四题,想不出什么特别好的方法……题目挺简单,但要想效率最高,感觉还得好好想想算法……
第五题,肯定不会一直执行下去,最后应该是内存爆了……
{
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: 内存溢出
s1 = abc
s2 = abcabcabcacb这个也返回true的应该,Lz貌似讲s1是循环的...
lz说的s1是循环移位,应该不是不断循环长下去吧……
不过提醒我了,的确应当先判一下s1是不是比s2长,不是的话应该直接返回false……
引用 26 楼 yoyoalphax 的回复:
引用 24 楼 wryse 的回复:
补充:第四题,把s1复制成两个,前后接起来,构成s1',然后判断s2是否是s1'的子字符串……
s1 = abc
s2 = abcabcabcacb 这个也返回true的应该,Lz貌似讲s1是循环的...
lz说的s1是循环移位,应该不是不断循环长下去吧……
不过提醒我了,的确应当先判一下s1是不是比s2长,不是的话应该直接返回false…不是循环移位
private int test(char ch)
{
int count=0;
for(int i=7;i>=0;i--)
{
count+=(ch&(1<<i))==0?0:1;
}
return count;
}不知这样写效率如何
while (n)
{
n &= n-1;
++count;
}
有几个1就循环几次,一次都没有浪费,应该是最快的方法了。
2、上10以后下个数的个位是5或者0的返回2;
3、往内存上排吧;
4、我悟性不够,没看懂;
5、你以为递归不要资源的啊,当然越来越慢,XP系统的话应该会提示循环冗余;
借花献佛一下,这算法也是从别人那里看来的。最巧妙的地方在于它能除掉最后一个1,每执行一次n&=(n-1),就少掉最后一个1,所以就是几个1就循环几次。
int Count(int n){ int num = 0; while(n > 0) { n &= (n-1); num++; } return ++;}
{
return n>=10?2:1;
}
1. A
2.
int HasTwoZero(int n)
{
return n>=10?2:1;
}
3.
while(n &= (n-1)) count++
4.本人认为是字符串匹配问题,这个都有经典算法
www.ilikebook.com.cn有相关的书籍