`
rayloo
  • 浏览: 87962 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

微软面试技术题

阅读更多

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://en.wikipedia.org/wiki/Floyd's_cycle-finding_algorithm

http://ostermiller.org/find_loop_singly_linked_list.html

http://www.cnblogs.com/wqguan/archive/2006/06/20/

不是随便两个步长不同的指针都会在循环链表上相遇。一个充分条件是,两个遍历指针步长相差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;
}

链表逆序本来就是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函数。

分享到:
评论

相关推荐

    微软试题合集 微软面试题

    首先,编程题是微软面试中必不可少的部分,可能包括C++、Java、Python等主流编程语言的题目。面试官会关注候选人的代码质量、逻辑思维以及问题解决能力。例如,可能会要求你实现一个排序算法,或者解决一个经典的...

    微软 面试试题及答案 .

    本压缩包中的“微软面试试题及答案.txt”文件,很可能是收集了一些在微软面试过程中可能会遇到的问题及其解答,旨在帮助应聘者更好地准备面试。 面试题目的类型通常包括技术问题、行为问题和情境问题。对于技术问题...

    微软面试100题系列之高清完整版PDF文档[带目录+标签]by_July

    微软面试100题系列是由知名博主July创作的一套旨在帮助求职者准备技术面试的资源。该系列包含了11篇文章,总共300多道面试题,主要聚焦于数据结构、算法以及海量数据处理三大主题。这些内容来源于July在其个人博客...

    微软面试100题

    微软面试题集在软件开发领域一直备受关注,特别是对于那些希望进入微软或类似科技公司的软件工程师来说。微软面试题通常涉及数据结构与算法,是考察应聘者编程能力与问题解决技巧的重要手段。本文档所提供的内容涵盖...

    微软面试100题系列

    【微软面试100题系列】是一套针对应聘者准备微软公司面试的综合资源,包含了11篇文章,总计300多道问题,旨在帮助求职者深入理解和掌握与Windows操作系统和微软技术栈相关的知识,从而在面试中表现出色,顺利获得...

    微软技术面试心得大全

    首先,微软面试通常会涉及计算机科学的基础概念,包括数据结构(如数组、链表、栈、队列、树、图等)、算法(排序、查找、动态规划、贪心策略等)以及复杂度分析(时间复杂度和空间复杂度)。面试官可能会让你现场...

    微软面试100题完整版(题目答案齐全)

    本资源包含了“微软面试100题完整版”,提供详尽的答案解析,对于准备微软、腾讯、百度等顶尖互联网企业面试的求职者来说,无疑是宝贵的复习材料。 这100题涵盖了算法设计、数据结构、操作系统、网络、数据库、软件...

    ms100(微软面试100题)答案整理版 绝对清晰

    因此,深入研究和理解微软面试题,如“ms100(微软面试100题)”,对于提升个人面试表现有着不可估量的价值。 #### 2. 二元查找树转排序双向链表问题 此题目是微软面试中一道经典算法题,要求在不创建新节点的前提...

    微软面试题之技术问答

    本压缩包中的“微软面试技术问答”很可能包含了微软在面试中常问的一些技术问题,涉及编程语言、算法、数据结构、操作系统、网络等多个方面。下面,我们将针对这些可能涵盖的知识点进行详细的解读。 1. **编程语言*...

    微软面试100题(含参考答案).pdf

    以下是一些基于微软面试100题中的关键知识点的详细解释: 1. **数据结构**: - **数组**:基础的数据结构,用于存储同类型元素的集合,支持随机访问。 - **链表**:非连续存储,通过指针连接节点,插入和删除操作...

    IBM,MBA,微软面试题集

    【微软面试题集】 微软作为科技巨头,其面试题集偏重于技术深度、创新思维和问题解决能力。核心知识点: 1. **计算机科学基础**:熟悉数据结构、算法、操作系统和计算机网络的基本概念。 2. **编程能力**:深入...

    最新微软c++面试题

    微软面试的特色在于不仅包括技术问题,还包括逻辑谜题和行为面试。这些问题旨在全面评估应聘者的创新思维、解决问题的能力和团队合作潜力。面试过程中,面试官可能会提出一些非传统的问题,以观察应聘者在压力下的...

    微软的面试题及答案 非常好,很难找

    【微软面试题解析】 面试是求职过程中的关键环节,尤其对于技术岗位,面试题往往具有挑战性和创新性。微软作为全球知名的科技公司,其面试题不仅考察候选人的专业技能,还涉及逻辑思维、问题解决和创新能力。以下是...

    微软面试 BI 工程师 试题

    在微软的BI工程师面试中,试题涵盖了多个关键领域,包括数据库管理、数据迁移、实时数据同步、多维数据分析以及报表生成。以下是对这些知识点的详细解释: 1. **数据库安装与恢复**: - **SQL Server 2008 R2**:...

    微软面试题-就是一个word文档

    这份名为“微软面试题”的文档,很可能是包含了微软在招聘过程中常问的一些技术问题,旨在考察候选人的计算机科学基础、编程能力、问题解决技巧以及对微软产品和技术的理解。下面,我们将深入探讨这些可能涉及的面试...

    微软面试(逻辑思维训练.) 含答案

    文件"微软面试题.txt"很可能包含了微软在面试中常问的逻辑思维题目,这些题目可能涵盖算法设计、问题解决、数据分析、编程逻辑等多个方面。这些问题通常需要应聘者以逻辑清晰、条理分明的方式去分析问题,找到最优...

    微软面试题解析与答案 - 微软(Microsoft)

    微软2012年的面试解析与答案,很详细。

    编程之美微软技术面试心得.doc

    12. 编程能力的重要性:编程能力是微软技术面试的另一个重要环节,面试官会通过编程题来评估面试者的编程能力和问题解决能力。 13. 软件设计模式的重要性:软件设计模式是微软技术面试的一个重要环节,面试官会通过...

    微软面试题 数据结构 C++

    以上几个问题和解决策略涵盖了数据结构和算法领域的核心概念,对于准备微软等公司的技术面试来说,是非常有价值的练习。理解并掌握这些知识点,不仅有助于提升算法思维能力,还能增强在实际编程中解决问题的能力。

Global site tag (gtag.js) - Google Analytics