IT公司2012筆面雜談

搜狗筆試感想
選擇:
1、順序、查半、分塊、hash查找時間效率比較(順序<分塊<折半<hash)

2、排序空間佔用(快排O(lgn),歸併O(n),其它O(1))

3、三星指針(理解&a+1和取*操作)

#include <stdio.h>

int main()
{
	const char *c[]={"enter", "new", "point", "first"};
	const char **cp[]={c+3,c+2,c+1,c};
	const char ***cpp = cp;
	const char ***cpp1 = cp;

	printf("%s", **++cpp);
	printf("%s",*--*++cpp+3);
	printf("%s",*cpp[-2]+3);
	printf("%s\n",cpp[-1][-1]+1);

	return 0;
}
結果:pointerstew
4、sum和

#include <stdio.h>

int main()
{
	short input[10]={'A','B','C','D','E'};
	int s = 0;
	char* p = (char*)input;
	for(int i=0;i<sizeof(input);++i){
		char v = p[i];
		if(v>0)
			s+=v-'A'+i;
	}
	printf("%d\n",s );

	return 0;
}
結果:30
填空:
1、高度爲8的AVL樹至少節點數(類似於Fibonacci數列求解,54)

2、A、B、C、D四個節點組成二元樹種類(求好的解釋)

編程:

1、二維數組A[n][n],對數組每一個元素滿足A[i][j]>A[i-1][j] && A[i][j]>A[i][j-1](在下標滿足條件時),現在實現一個函數find快速查找給定value的元素,如果存在返回true並給出i,j,否則返回false。(折半查找)

#include <stdio.h>

const int n = 1024;

bool find(int A[n][n], int x1, int x2, int y1, int y2, int value, int& a, int& b)
{
	if(x1==x2 && y1==y2){
		if(A[x1][y1]== value){
			a = x1, b = y1;
			return true;
		}else{
			a = b = -1;
			return false;
		}
	}else if(x1>x2 || y1>y2){
		a = b = -1;
		return false;
	}else{
		int i = x1, j = y1;
		while(i <= x2 || j <= y2){
			if(A[i][j] > value){
				if(find(A,x1,i-1,j,y2,value,a,b))
					return true;
				else if(find(A,i,x2,y1,j-1,value,a,b))
					return true;
				else
					return false;
			}else if(A[i][j] == value){
				a = i, b = j;
				return true;;
			}
			if(i>x2 && j>y2)
				return false;
			else if(i > x2){
				return find(A,x1,x2,j,y2,value,a,b);
			}
			else if(j > y2){
				return find(A,i,x2,y1,y2,value,a,b);
			}else{
				++i, ++j;
			}
		}
	}
}

int main()
{
	int a[n][n]={
		{1,2,3,4,6},
		{5,7,8,9,10},
		{11,12,13,14,16},
		{15,17,18,19,20},
		{21,22,23,24,25},
	};
	const int num = 5;
	for(int i=0;i<num;++i){
		for(int j=0;j<num;++j)
			printf("%d\t", a[i][j]);
		printf("\n");
	}
	int x, y;
	int findArray[]={0,1,5,9,10,26,31};
	int size = sizeof(findArray)/sizeof(int);
	for(int i=0;i<size;++i){
		int value = findArray[i];
		bool ans = find(a,0,num-1,0,num-1,value,x,y);
		if(ans){
			printf("find %d in x=%d\ty=%d\n", value, x, y);
		}else{
			printf("can't find %d\n", value);
		}
	}
	return 0;
}


2、一維數組A[n],可以從中找到長度相等的非降等差數列子串若干,求使等差數列長度L最大的這些子等差數列。
例子:A={1,8,3,5,10,12} => L = 2 子序列爲{1,3,5}和{8,10,12}(求思路)



有道筆試感想
1、什麼是Singleton模式及實現(多線程時需要加鎖)
2、前序、中序求後序,要求返回後序串(關鍵是如何實現不用全局返回後序串,採取static指針首次申請內存實現)
3、字符串的最長迴文子串(DP實現)


Google一面感想
1、返回一個字符串十進制數加一後的結果。(寫出最精簡的代碼)
2、12345(?)67(?)89返回可以整除7的數,其中?表示[0-9]。(算是DP思想?)
3、一維座標上n個點,如果去掉m個點,使得餘下的點最小間距最大。(二分查找)


百度前兩面感想
1、小端模式判斷(union判斷)
2、實模式保護模式(考的有點偏,偶又不是搞X86的)
3、LRU算法實現(鏈表模擬)
4、字符串十進制整數除以d除餘(類似DP)
5、36匹馬6個跑道,如果最少場數求出前K快的馬(求解答)


美國國家儀器電面感想
1、各種排序
2、多態
3、拷貝構造(有點意思)、賦值
4、單鏈表反序(電話中說出代碼,還是有點難度)
5、英語介紹一下北京和蘇州(說了一半說不下去了)


小米筆試感想
1、字符串中word反序,比如“i love you”=>"you love i"
2、打印n對括號所有合理排列,“)()(”這種即不合理。(用進棧出棧模擬)
3、O(1)實現棧的max或min操作(雙棧實現)
4、一致性hash(很重要,解決n個object映射到m個server上的問題)


Cadence一面感想
1、extern和static
2、拷貝構造函數
3、C編譯與C++編譯後符號區別,爲什麼C++可重載


盤古搜索筆試感想
各種C/C++問題


微策略筆試感想
1、去掉C/C++註釋(很考驗編程能力)
2、判斷串s1插入s2後能否迴文(先拼接s1和s2判斷迴文,然後再剝離s2首尾字符,子問題求解)
3、8*8的格,每個格有value,只允許向下向右走,問從(0,0)到(7,7)路過的value和最大多少?如果不超過max的value和最大多少?(第一問簡單DP,最二問揹包)


Yahoo筆試感想
1、判斷單鏈表是否迴文
2、rand6()如何實現rand7()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章