评论
# re: 微软MSN面试1-合并相同的字符 2006-01-21 04:59
好像写错了吧?
这样pop和push,只是判断stack的top是否和下一个重复。
我觉得应该用hash
我的QQ3000079
# re: 微软MSN面试1-合并相同的字符 2006-01-22 04:50
用hash实际上走进误区了,至少由于你不知道实际序列的长度使得这个hash函数不是很容易设计得很好
其实,我当时面试的时候就是一开始也是想到用hash函数来实现的,花了快半个小时还是没有真正搞定,和那个面试官就hash map里面的种种细节问题纠缠了一半天,完全是走进误区了:)
# re: 微软MSN面试1-合并相同的字符 2006-01-22 05:07
哈哈,没看清楚题目。。
看清了真的很简单啊。。郁闷。。;(
# re: 微软MSN面试1-合并相同的字符 2006-01-27 02:17
为什么要用STL容器呢 扫描一遍原来的数组就可以确定了啊
#include <iostream>
using namespace std;
int main(void)
{
int arr[]={1,1,1,2,2,3,3,1,0};
int i,j,k,t;
for (i=1,j=0,k=0; arr[i]; ++i)
{
if (arr[i]!=arr[j])
{
arr[++k]=arr[i];
j=i;
}
}
arr[++k]=0;
for (i=0; i<=k; ++i)
{
cout<<arr[i]<<endl;
}
return 0;
}
# re: 微软MSN面试1-合并相同的字符 2006-01-27 02:18
晕 怎么贴代码的?
# re: 微软MSN面试1-合并相同的字符 2006-02-05 18:53
To sharang
1.直接扫描一遍数组的确是可以的,但是对于这样一类问题,有时候直接使用stl容器也许想法更加简单,再面试的时候不容易出错(我指的是任何可能的错误,因为微软面试的时候对于这个要求还是蛮严格的)
算法复杂度往往更可以得到保证
2.至于怎么贴代码,呵呵,你可以使用高级评论,里面可以插入评论
# re: 微软MSN面试1-合并相同的字符 2006-02-20 01:07
直接扫描有什么问题么?像这种题目,只要保证数组的边界不overflow,我觉得直接用数组没有任何问题。
当然,使用stl也未尝不可,但在时空及代码可移植性上稍有欠缺,在某些embedded system中是不能使用stl的 。
此外,不管使用stl还是直接扫描数组,时间复杂度都是O(n);不会出现时间复杂度无法控制的现象
# re: 微软MSN面试1-合并相同的字符 2006-02-24 18:38
你说的由道理,但是我这个人有点懒,习惯用现成的东西,而且直接使用数组还是有点风险的,因为这个下标很容易弄错,我以前吃过大亏,有点怕怕了~
呵呵,希望我的这种观点疑惑兄不要介意...
# re: 微软MSN面试1-合并相同的字符 2006-02-26 01:38
有没有这么麻烦居然用stack!!
很简单呀!
#include "stdafx.h"
#include "malloc.h"
#include "string.h"
int main()
{
char *p="111223310";
int i,j,len;
char c;
char *outptr;
len=strlen(p);
if (len>0)
outptr=(char *)malloc(len);
else
return (-1); //error
j=0;
for(i=0;i<len;i++)
{
if (i==0)
{
c=p[i];
outptr[j]=c;
j++;
}
else if (c!=p[i])
{
c=p[i];
outptr[j]=c;
j++;
}
}
outptr[j]=0;
printf("%s",outptr);
return (0);
}
# re: 微软MSN面试1-合并相同的字符 2006-02-26 01:43
是不是 不用stl等等的,微软的人会认为:不务实,什么都从开始写?
对面试有影响? 随便问问?
微软是我做梦都向往的!
交个朋友呀!
# re: 微软MSN面试1-合并相同的字符 2006-02-26 02:03
写完才发现忘了释放free p;唉!
# re: 微软MSN面试1-合并相同的字符 2006-02-26 03:23
这个题目我希望做最后一次的声明:
由于给定的这个序列其实表示的是接收的一帧信息,我们要做的相当于"解码"工作.特别要注意以下有两个限制条件(或者叫信息)
1)长度动态可变,这意味着靠长度这个变量赖控制循环是不现实的;
2)以字符"0"标识结束,也就是只要发现一个"0"就表示当前接收的一帧信息完毕.这个信息是最重要的信息.
前面的sharang,疑惑以及田文平的想法都是不完整的-在微软看来就是错误的.
我前面的留言,当时是因为时间较久了,我自己题目也忘了,所以就没有给出正确的回复.但是必须要说明的是,大家一定要看清楚限制条件!
我贴的那个代码是在面试完不久,思路就是面试那天的思路,应该是正确的.采用数组的方法固然有的时候比较简洁,但是,我建议,在比如象面试这种场合的时候最好用stl,因为,你至少可以集中精力把题目看清楚!
# re: 微软MSN面试1-合并相同的字符 2006-04-13 19:16
#include<iostream>
int main()
{
int a[]={1,1,1,2,2,3,3,1,0};
int *p;
p = a;
while(*p!=0)
{
cout<<*p<<",";
p++
}
# re: 微软MSN面试1-合并相同的字符 2006-04-13 19:20
#include<iostream>
int main()
{
int a[]={1,1,1,2,2,3,3,1,0};
int b,*p;
p = a;
while(*p!=0)
{
if(b!=*p) {
b=*p;
cout<<b<<",";
p++;
}
}
}
# re: 微软MSN面试1-合并相同的字符 2006-04-15 02:06
我觉得这道题是不是加上一个“只可以在原来的数组上操作”才是考官的真实目的呀,我的算法如下:
bool remove_duplicate(int a[])
{
int i,j;
if(a[0]) return false;
i=1, j=0;
while(a[i] != 0)
{
if(a[i] == a[i-1-j]) j++;
else a[i-j]=[i];
i++;
}
if(j>0) return false;
return true;
}
我想这个算法无论是时间还是空间都是最低的。可惜呀,本人没有msntc的面试机会。有没有人想交个朋友可以和我联系capzhou@hotmail.com
# re: 微软MSN面试1-合并相同的字符 2006-04-15 02:08
应该还要在末尾加上一个零
bool remove_duplicate(int a[])
{
int i,j;
if(a[0]) return false;
i=1, j=0;
while(a[i] != 0)
{
if(a[i] == a[i-1-j]) j++;
else a[i-j]=[i];
i++;
}
a[i-j]=0;
if(j>0) return false;
return true;
}
# re: 微软MSN面试1-合并相同的字符 2006-04-15 02:14
应该还要在末尾加上一个零
bool remove_duplicate(int a[])
{
int i,j;
if(a[0]) return false;
i=1, j=0;
while(a[i] != 0)
{
if(a[i] == a[i-1-j]) j++;
else a[i-j]=[i];
i++;
}
a[i-j]=0;
if(j>0) return false;
return true;
}
# re: 微软MSN面试1-合并相同的字符 2006-04-15 13:06
bool remove_duplicate(int a[])
{
int i,j;
if(!a[0]) return false;
i=1, j=0;
while(a[i])
{
if(a[i] == a[i-1-j]) j++;
else a[i-j]=[i];
i++;
}
a[i-j]=0;
if(j>0) return false;
return true;
}