First Phone Interview:
1.提出尽可能多的方法使一个method可以返回多个不同type的值
2.reverse string
比如 "I have a dream" -> "dream a have I"
3.判断一个binary tree是不是对称的
Second Phone Interview:
1.给a list of number,返回前top K个(内存足够怎么做,内存不够怎么做)
2.用OOD来电梯
3.找两个链表的交集
Onsite 6轮 1轮HR 1轮午餐 4轮技术 (亚马逊web services team)
1.设计个电话本, 可以用那些数据结构
答案貌似可以用suffix tree或者hashtable
2.问research, OOD 交通灯系统
3.写函数算一个整数的阶层 n!, 又问了n很大,怎么办?
比如99%的n都在400000-900000之间,怎么提高函数的执行速度
4.给一个数组和一个数n,找出数组中的所有的对和等于n的
5.给手机键盘,给定某个按键序列比如'1489',返回这个按键序列生成的所有的正确单词
1.判断一年是否为闰年的方法
- #include "stdio.h"
- int isRun(int num)
- {
- int ret =0;
- if(num%4==0)
- {
- ret=1;
- if(num%100==0)
- {
- ret =0;
- }
- if(num%400==0)
- {
- ret =1;
- }
- }
- return ret;
- }
- int main()
- {
- int year;
- scanf("%d",&year);
- if(isRun(year))
- {
- printf("run\n");
- }
- else
- {
- printf("no\n");
- }
- return 0;
- }
2 Please write a program which can print all 6 digitsnumbers composed of 1, 2, 2,3,4,5.
- #include "stdio.h"
- void showAnother(char *str,int start,int num)
- {
- int i=0;
- char c;
- if(str[start]=='\0')
- {
- printf("%s\n",str);
- }
-
- if(str == NULL)
- return;
-
- for(i=start;i<num;i++)
- {
- c = str[start];
- str[start]=str[i];
- str[i]=c;
- showAnother(str,start+1,num);
- c = str[start];
- str[start]=str[i];
- str[i]=c;
- }
- }
- void showDigit(char *str,int start,int num)
- {
- int i=0;
- char c;
- if(str == NULL)
- return;
-
- for(i=start;i<num;i++)
- {
- c = str[start];
- str[start]=str[i];
- str[i]=c;
- showAnother(str,start+1,num);
- c = str[start];
- str[start]=str[i];
- str[i]=c;
- }
-
-
- }
-
-
- int main()
- {
- char str[]="122345";
-
- showDigit(str,0,sizeof(str)/sizeof(str[0]));
-
-
- }
3
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am astudent.”,则输出“student. a am I”。
- #include "stdio.h"
- #include "string.h"
- #define MAX 1024
- #define CHARLEN 256
- void strReverse(char *str,int start,int len)
- {
- int begin;
- int end;
- int temp,i;
- char c;
- if(str == NULL)
- return;
- begin =start;
- for(end=start;end<=len;end++)
- {
- if(str[end]==' '||str[end]=='\0')
- {
- temp =end;
- temp -=1;
- for(;begin<temp;begin++,temp--)
- {
- c =str[temp];
- str[temp]=str[begin];
- str[begin]=c;
- }
- begin =end+1;
- }
- }
- end =len-1;
- for(i=start;i<end;i++,end--)
- {
- c = str[i];
- str[i]=str[end];
- str[end]=c;
- }
- }
- int main()
- {
- char str[MAX];
- int i;
- int len;
- gets(str);
-
- len = strlen(str);
- strReverse(str,0,len);
- printf("%s\n",str);
- return 0;
- }
4
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”Theyare students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
- #include "stdio.h"
- #include "string.h"
- #define MAX 1024
- #define CHARLEN 256
- int main()
- {
- char str[MAX];
- char strToMove[MAX];
- int mask[CHARLEN];
- int i;
- int len;
- int lenToMove;
- memset(mask,0,sizeof(int)*CHARLEN);
- gets(str);
- getchar();
- scanf("%s",strToMove);
- len = strlen(str);
- lenToMove = strlen(strToMove);
- for(i=0;i<lenToMove;i++)
- {
- mask[strToMove[i]]=1;
- }
- for(i=0;i<len;i++)
- {
- if(!mask[str[i]])
- printf("%c",str[i]);
- }
- putchar('\n');
- }
5 求字符串所有子字符串(顺序不同算一个)
题目大致意思要求一个字符串所有子字符串(长度从1到总长,但顺序不同,如ab和ba算一个)
此题有个解法可以利用二进制处理【只能是当字符串中不出现重复字符的时候】
- #include "stdio.h"
- #include "string.h"
- #include "math.h"
-
- #define MAX 1024
- #define CHARLEN 256
-
-
-
- int main()
- {
- char str[MAX];
- int len;
- int number;
- int i,j;
- scanf("%s",str);
- len = strlen(str);
- number = pow(2,len);
- printf("All str list\n");
- for(i=1;i<number;i++)
- {
- for(j=0;j<len;j++)
- {
- if((i>>j)&1)
- {
- putchar(str[j]);
- }
- }
- putchar('\n');
- }
- }
当字符串重复的时候, 先排序nlogn,此时重复的字符会变成连续的,bcaeb 排序以后,abbce, 在用O(n)把排序数组去重,再用上面方法。
6. Swap two nodes in list
SWAP(node *head, node *first, node *second)
这道题目 还要构建节点比较复杂,题目的意思 就是交换两个节点。
当然这道题目 需要指针操作。
不能进行值的交换,因为类型不明哦。
7 Find Longest Repeat SubString ,可以overlap,区分大小写
这道题一看就是典型的后缀数组的题目
应该比较简单
我跑一遍试试。
- #include "stdio.h"
- #include "string.h"
- #include "math.h"
- #include "assert.h"
- #define MAX 1024
- #define CHARLEN 256
-
- int Partion(char *str[MAX],int s,int e)
- {
- int i=s-1;
- int j;
- char *p = str[e];
- char *temp;
- for(j=s;j<e;j++)
- {
- if(strcmp(str[j],p)<0)
- {
- temp = str[i+1];
- str[i+1] = str[j];
- str[j]=temp;
- i+=1;
- }
-
- }
- temp = str[i+1];
- str[i+1] = p;
- str[e]=temp;
- return i+1;
- }
-
- void quickSort(char *str[MAX],int start,int end)
- {
- int q;
- if(start<end)
- {
- q = Partion(str,start,end);
- quickSort(str,start,q-1);
- quickSort(str,q+1,end);
-
- }
-
- }
- int comLen(char *str1,char *str2)
- {
-
- int count =0;
- assert(str1&&str2);
- while(*str1==*str2)
- {
- if(*str1=='\0'||*str2=='\0')
- break;
- count++;
- str1++;
- str2++;
- }
- return count;
- }
- int main()
- {
- char str[MAX];
- char answer[MAX];
- char *strPoint[MAX];
- int i,len;
- int maxLen,clen;
- scanf("%s",str);
- len = strlen(str);
- for(i=0;i<len;i++)
- {
- strPoint[i]=str+i;
- }
- quickSort(strPoint,0,len-1);
- maxLen =0;
- for(i=0;i<len-1;i++)
- {
- clen = comLen(strPoint[i],strPoint[i+1]);
- if(clen >maxLen)
- {
- strncpy(answer,strPoint[i],clen);
- answer[clen]='\0';
- maxLen = clen;
- }
- }
- printf("%s\n",answer);
- }
用快排+后缀数组来解决的,还好测试的比较顺利