日复一日

厚积薄发|跳跃的人生

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  28 随笔 :: 0 文章 :: 78 评论 :: 0 引用

最新评论

共2页: 1 2 下一页 
re: 微软面试技术题(4) Afro 2008-10-10 11:35  
全排列
re: 微软面试智力题(5) xs 2008-04-02 21:29  
说得好!!
re: 微软面试智力题(1) atg 2008-03-25 17:06  
3楼,北极是无色的,谁说是白色的,他的毛是透明的.
re: 微软面试技术题(14) 注意测试哦 2008-01-29 07:13  
程序结果不对。而且这样把数组内容都毁掉了。
比如,『3,4,2,0,1』,并没有重复的,结果却返回1.
re: 微软面试智力题(1) HFJHJSDGHJ 2007-11-02 11:33  
北极熊当然是白色的啦!
re: 微软面试智力题(5) 么 2007-04-06 03:22  
如果第一天给他的被他花了呢? 第二天就要不 回来了
re: 微软面试智力题(5) 孙继 2007-03-09 15:51  
第八天给他4/7,要回2/7
re: 微软面试智力题(5) 12 2007-02-22 10:25  
在人照镜子的时候,伸出左手看到的是左手伸出右手是右手,但是在抬头的时候为什么不是低头
re: 微软面试技术题 dddddddd 2007-01-30 12:57  
nihao,what your name?
re: 微软面试技术题(5) dddddddd 2007-01-30 12:56  
ddddddddd
re: 微软面试技术题(5) dddd 2007-01-30 12:55  
dddd
re: 微软面试技术题(22) Ethernet 2006-10-14 11:42  
第1题想法不错,就只要扫描一遍.
而第3题是效率的问题,如果这样,估计微软不满意.
时间复杂度要达到o(N^3).太慢了.
re: 微软面试技术题(0) Ethernet 2006-10-14 11:18  
一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素。
时间复杂度可以O(n)的.你的应该是O(n*MAX(change)).
不知道我有没有说对.
re: 微软面试智力题(3) jlzhdm 2006-09-20 21:16  
从贴混合的篮子中拿,如果是苹果,则这筐全是苹果,那么贴橘子的是混合的,贴苹果的全是橘子。
re: 微软面试智力题(5) 唐骏 2006-09-04 08:24  
把该金条分三份,分别是1/7,2/7,4/7.第一天工作结束时给他1/7,第二天工作结束时给他2/7,并且要回第一天给他的1/7,第三天工作结束时给他1/7,第四天工作结束时 他4/7,并要回哪1/7,2/7.第五天给他1/7,第六天给他2/7,要回1/7,第七天给他1/7.
re: 微软面试智力题(4) 唐骏 2006-09-04 01:02  
第一步,称123,456如果相等,则是7或8.第二步,称1,7如相等,则是8.
re: 微软面试智力题(1) 米日擦了 2006-08-18 17:17  
尾巴向下
re: 微软面试技术题(0) Aaron 2006-07-25 22:09  
一口气看完,帮搂主做点事情
—————————————

1、反转一个链表。循环算法。
List reverse(List l) {
if(!l) return l;
list cur = l.next;
list pre = l;
list tmp;
pre.next = null;
while ( cur ) {
tmp = cur;
cur = cur.next;
tmp.next = pre
pre = tmp;
}
return tmp;
}


2、反转一个链表。递归算法。
List resverse(list l) {
if(!l || !l.next) return l;

List n = reverse(l.next);
l.next.next = l;
l.next=null;
}
return n;
}


3、广度优先遍历二叉树。
void BST(Tree t) {
Queue q = new Queue();
q.enque(t);
Tree t = q.deque();
while(t) {
System.out.println(t.value);
q.enque(t.left);
q.enque(t.right);
t = q.deque();
}
}
class Node {
Tree t;
Node next;
}
class Queue {
Node head;
Node tail;
public void enque(Tree t){
Node n = new Node();
n.t = t;
if(!tail){
tail = head = n;
} else {
tail.next = n;
tail = n;
}
}
public Tree deque() {
if (!head) {
return null;
} else {
Node n = head;
head = head.next;
return n.t;
}
}


4、输出一个字符串所有排列。注意有重复字符。
char[] p;
void perm(char s[], int i, int n){
int j;
char temp;
for(j=0;j<n;++j){
if(j!=0 && s[j]==s[j-1]);
elseif(s[j]!='@'){
p[i]=s[j];
s[j]='@';
if(i==n-1){
p[n]='\0';
printf("%s", p);
}else{
perm(s,i+1,n);
}
s[j]=p[i];
}
}
}

void main() {
char s[N];
sort(s);
perm(s,0,strlen(s));
}


5、输入一个字符串,输出长型整数。
long atol(char *str){
char *p = str;
long l=1;m=0;
if (*p=='-') {
l=-1;
++p;
}
while(isDigit(*p)){
m = m*10 + p;
++p;
}
if(!p) return m*l;
else return error;
}


6、判断一个链表是否有循环。
int isLoop(List l) {
if ( ! l) return - 1 ;
List s = l.next;
while (s && s != l) {
s = s.next;
}
if ( ! s) return - 1 ;
else reutrn 1 ;
}

int isLoop(List l){
if(!l) return 0;
p=l.next;
wihle(p!=l&&p!=null) {
l.next=l;
l=p;p=p.next;
}
if(p=l) return 1;
return 0;
}
实际上,在我的面试过程中,还问到了不破坏结构的其他算法。
我的答案是从链表头开始遍历,如果节点next指针指向自身,则循环存在;否则将next指针指向自身,遍历下一个节点。直至next指针为空,此时链表无循环。

http://ostermiller.org/find_loop_singly_linked_list.html
http://en.wikipedia.org/wiki/Floyd's_cycle-finding_algorithm

http://ninputer.cnblogs.com/">http://ninputer.cnblogs.com/
不是随便两个步长不同的指针都会在循环链表上相遇。一个充分条件是,两个遍历指针步长相差1。最好是1,2这两个步长,这样就可以进而求出循环的位置和链表的大小。


7、反转一个字符串。
void reverse( char * str) {
char tmp;
int len;
len = strlen(str);
for ( int i = 0 ;i < len / 2 ; ++ i) {
tmp = char [i];
str[i] = str[len - i - 1 ];
str[len - i - 1 ] = tmp;
}
}


8、实现strstr函数。
int strstr(char[] str, char[] par){
int i=0;
int j=0;
while(str[i] && str[j]){
if(str[i]==par[j]){
++i;
++j;
}else{
i=i-j+1;
j=0;
}
}
if(!str[j]) return i-strlen(par);
else return -1;
}


9、实现strcmp函数。
int strcmp(char* str1, char* str2){
while(*str1 && *str2 && *str1==*str2){
++str1;
++str2;
}
return *str1-*str2;
}


10、求整形中二进制1的位数
求一个整形中1的位数。
int f( int x) {
int n = 0 ;
while (x) {
++ n;
x &= x - 1 ;
}
return n;
}


11、汉诺塔问题。
void tower(n,x,y,z){
if(n==1) move(x,z);
else {
tower(n-1, x,z,y);
move(x,z);
tower(n-1, y,x,z);
}
}


12、汉诺塔最小步数

三柱汉诺塔最小步数。
int f3(n) {
if (f3[n]) return f3[n];
else {
if (n == 1 ) {
f3[n] = 1 ;
return 1 ;
}
f3[n] = 2 * f3(n - 1 ) + 1 ;
return f3[n];
}
}

四柱汉诺塔最小步数。
int f4(n){
if(f4[n]==0){
if(n==1) {
f4[1]==1;
return 1;
}
min=2*f4(1)+f3(n-1);
for(int i=2;i<n;++i){
u=2*f4(i)+f3(n-i);
if(u<min) min=u;
}
f4[n]=min;
return min;
} else return f4[n];
}


13、在一个链表中删除另一个链表中的元素。
void delete(List m, List n) {
if(!m || !n) return;
List pre = new List();
pre.next=m;
List a=m, b=n,head=pre;
while(a && b){
if(a.value < b.value) {
a=a.next;
pre=pre.next;
}else if(a.value > b.value){
b=b.next;
}else{
a=a.next;
pre.next=a;
}
}
m=head.next;
}


14、一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素。
int hasDuplicate(int[] a, int n){
for(int i=0;i<n;++i){
while(a[i]!=i && a[i]!=-1){
if(a[a[i]]==-1) return 1;
a[i]=a[a[i]];
a[a[i]]=-1;
}
if(a[i]==i) {a[i]=-1;}
}
return 0;
}


15、判断一颗二叉树是否平衡。
int isB(Tree t){
if(!t) return 0;
int left=isB(t.left);
int right=isB(t.right);
if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1)
return (left<right)? (right +1) : (left + 1);
else return -1;
}


16、返回一颗二叉树的深度。
int depth(Tree t){
if(!t) return 0;
else {
int a=depth(t.right);
int b=depth(t.left);
return (a>b)?(a+1):(b+1);
}
}


17、两个链表,一升一降。合并为一个升序链表。
List merge(List a, List d) {
List a1 = reverse(d);
List p = q = new List();
while ( a && a1 ) {
if (a.value < a1.value) {
p.next = a;
a = a.next;
} else {
p.next = a1;
a1 = a1.next;
}
p = p.next;
}
if (a) p.next = a;
elseif(a1) p.next = a1;
return q.next;
}

不知道这道题朋友们有什么更好的方法?
http://ninputer.cnblogs.com/">http://ninputer.cnblogs.com/
链表逆序本来就是O(N),所以这道题再烂的做法也不会超过O(N)。我觉得先逆序再归并不会比设计一个个巧妙的方法一次组成目标链表慢多少的


18、将长型转换为字符串。
char* ltoa(long l){
char[N] str;
int i=1,n=1;
while(!(l/i<10)){i*=10;++n}
char* str=(char*)malloc(n*sizeof(char));
int j=0;
while(l){
str[j++]=l/i;
l=l%i;
i/=10;
}
return str;
}


19、用一个数据结构实现
if (x == 0) y = a;
else y = b;

j[] = {a,b};
y=j[x];


20、在双向链表中删除指定元素。
void del(List head, List node){
List pre=new List();
pre.next = head;
List cur = head;
while(cur && cur!=node){
cur=cur.next;
pre=pre.next;
}
if(!cur) return;
List post = cur.next;
pre.next=cur.next;
post.last=cur.last;
return;
}


21、不重复地输出升序数组中的元素。
void outputUnique( char [] str, int n) {
if (n <= 0 ) return ;
elseif(n == 1 ) putchar(str[ 0 ]);
else {
int i = 0 ,j = 1 ;
putchar(str[ 0 ]);
while (j < n) {
if (str[j] !== str[i]) {
putchar(str[j]);
i = j;
}
++ j;
}
}
}


22、面试过程中我还遇到了下面几题:
1、如何删除链表的倒数第m的元素?我的方法是先用pre指针从链表头开始步进m,新建pst节点next指针指向头节点,cur指针指向头节点,然后pre,cur,post三个指针一起步进,当pre指向链表结尾的时候cur指向倒数第m个元素,最后利用pst指针删除cur指向元素。
2、如何判断一个字符串是对称的?如a,aa,aba。设置头尾指针同时向中间比较靠齐直至相遇。
3、如何利用2函数找出一个字符串中的所有对称子串?以子串头指针和尾指针为循环变量设置两个嵌套的循环以找出所有子串,对每个子串应用2函数。
re: 微软面试智力题(3) dfdff 2006-07-12 22:58  
[url="http://www.fff.com"">http://www.fff.com"]数据恢复[/url]
[url=http://www.fff.com]翻译公司[/url]
<a href="http://www.fff.com"">http://www.fff.com">翻译公司</a>
re: 微软面试技术题(5) ATHLON 2006-07-04 22:55  
楼上,这个是atol,输出是整数
re: 微软面试技术题(5) 啊 2006-07-01 19:46  
-0.0823
你这程序能对吗?
re: 微软面试智力题(4) Elwin 2006-06-26 21:03  
分三堆,332,第一次称3和3,如果不平衡,取轻的一堆中的任意两个称,如果平衡,则取2的那堆1对1称。
re: 微软面试技术题(0) 冰火 2006-06-26 11:25  
咋这么多广告!看的晕啊
re: 微软面试技术题(6) 装配脑袋 2006-06-25 21:03  
不是随便两个步长不同的指针都会在循环链表上相遇。一个充分条件是,两个遍历指针步长相差1。最好是1,2这两个步长,这样就可以进而求出循环的位置和链表的大小。
re: 微软面试智力题(1) unknown 2006-06-24 10:02  
可是南极没有熊,仅是理论而已
re: 微软面试技术题(17) 装配脑袋 2006-06-24 09:41  
链表逆序本来就是O(N),所以这道题再烂的做法也不会超过O(N)。我觉得先逆序再归并不会比设计一个个巧妙的方法一次组成目标链表慢多少的
re: 微软面试技术题(0) 装配脑袋 2006-06-24 09:39  
点开22个窗口看吗?我们是想建议你把所有的题贴进一个文章,这样可以从头到尾地浏览,那多舒服啊
re: 微软面试技术题(4) sin(EaTing) 2006-06-22 20:25  
我是猪。
re: 微软面试技术题(6) swxiao 2006-06-22 18:17  
你的实现好象有问题!!
看看这个
http://ostermiller.org/find_loop_singly_linked_list.html
http://en.wikipedia.org/wiki/Floyd's_cycle-finding_algorithm
re: 微软面试技术题(4) lyj 2006-06-21 19:41  
你怎么控制不重复?
re: 微软面试技术题(17) Elwin 2006-06-21 19:38  
晕,我说的是,接成一个链表后,用冒泡法进行排序,这是很傻的做法。
re: 微软面试技术题(1) GwQ 2006-06-21 08:35  
@jinsuo zhang
不是:)
re: 微软面试技术题(4) GwQ 2006-06-21 08:35  
@Ques
已修改,谢谢。
re: 微软面试技术题(10) GwQ 2006-06-21 08:33  
@Elwin
是的
re: 微软面试技术题(7) GwQ 2006-06-21 08:32  
@Elwin
复杂度上是一样的
re: 微软面试技术题(6) GwQ 2006-06-21 08:31  
@Elwin
不错,这是经典的解答
re: 微软面试技术题(1) jinsuo zhang 2006-06-21 08:14  
@GwQ
另一家互联网公司,难道是Google?
re: 微软面试技术题(4) Ques 2006-06-20 22:24  
楼主的 str 和 d 是在哪里定义的啊?
printf("%s", d);
perm(str,i+1,n);
re: 微软面试技术题(10) Elwin 2006-06-20 21:53  
这不是是求整形中二进制1的位数么
re: 微软面试技术题(7) Elwin 2006-06-20 21:32  
我只想到可以用str[0]来当tmp用,当然事先需要用个变量保存一下,也就是把tmp从循环内拿到外面来而已。
re: 微软面试技术题(6) Elwin 2006-06-20 21:28  
他的意思是,使用两个步长不同的指针同时进行遍历,如果这两个指针指向同一个元素,则必循环
re: 微软面试技术题(17) GwQ 2006-06-20 20:40  
@Elwin
什么是后冒泡?
re: 微软面试技术题(4) GwQ 2006-06-20 20:40  
@lyj
哪里重复了?
re: 微软面试技术题(4) GwQ 2006-06-20 20:32  
@lyj
哈。师弟。
re: 微软面试技术题(18) GwQ 2006-06-20 20:31  
@Elwin
对的。已修正。
re: 微软面试技术题(7) GwQ 2006-06-20 20:27  
@lyj
愿闻其详
re: 微软面试技术题(17) Elwin 2006-06-20 16:10  
这样就可以了罢,难道还要接成一个后冒泡
re: 微软面试技术题(4) lyj 2006-06-20 16:07  
@GwQ
我觉得你这个
ABB可能会输出2次..
re: 微软面试技术题(4) lyj 2006-06-20 16:07  
@GwQ
学长啊
re: 微软面试技术题(18) Elwin 2006-06-20 16:02  
应该是while(l/i>=10)罢
共2页: 1 2 下一页