某互聯網公司20分鐘筆試題

某互聯網公司C++ 面試

1 分析C++程序運行內存分佈面試

2 寫一個函數,輸入n,求斐波那契數列的第N項 0 1 1 2 3 5 ......算法

3 楊輝三角實現函數


code部分沒有在紙上寫出來,知道思路,可是就是不知道如何code,不知道是否是腦子抽筋了!佈局

第一題:

咱們先說一下程序的組成,典型的可執行文件分爲兩部分:測試

  • 代碼段(code),由機器指令組成,該部分是不可改的,編譯以後就不在改變,放置在文本段(.text)
  • 數據段(data),它由一下幾部分組:
    • 常量(constant),一般放置在只讀 read-only的文本段(.text)
    • 靜態數據(static data),初始化的放置在數據段(.data);未初始化的放置在(.bss, BSS段的變量只有名稱和大小缺沒有值)
    • 動態數據(dynamic data),這些數據存儲在堆(heap)或棧(stack)

源程序編譯後連接到一個以0地址爲始地址的線性或者多維虛擬地址空間。並且每個進程都擁有這樣一個空間,每一個指令和數據都在這個虛擬地址空間擁有肯定的地址,把這個地址稱爲虛擬地址。將進程中的目標代碼、數據等的虛擬地址組成的虛擬空間稱爲虛擬存儲器。典型的虛擬存儲器中有相似佈局:3d

  • Text Segment(.text) 代碼段
  • Initialized Data Segment(.data) 初始化數據段
  • Uninitialized Data Segment(.bss) 未初始化數據段
  • The Stack 棧
  • The Heap 堆

以下圖所示: memory layoutcode

第二題

第二題是C語言基礎課本上的例子,多是面試經歷太少,忽略了基礎,找到了規律,可是就是不知道如何在紙上codeing出來.........blog

  • 遞歸
int fib(int n)
{
	if(n == 0 || n == 1)
		return n;
	return fib(n-1) + fib(n-2)
}
  • 非遞歸
int fib(int n)
{
  if(n < 2)
  {
  	return n;
  }
  int fib1 = 0;
  int fib2 = 1;
  int fibn = 0'
  int i = 0;
  for(i = 2; i <= n; i++)
  {
  	fibn = fib1 + fib2;
    fib1 = fib2;
    fib2 = fibn;
  }
  return fibn;
}

測試程序遞歸

int main(int argc,char **argv)
{
	int n = 6;
	int i = 0;
	for( ; i < n ; i++)
	{
		printf("%d\t", fib(i));
	}
	printf("\n");
	return 0;
}

第三題

#define N 6
int main(int argc,char **argv)
{
	int i,j;
	int a[N][N] = {0};
	for(i = 0; i < N ; i++)
	{
		a[i][0] = 1;
	}
	for(i = 1; i < N ; i++)
	{
		for(j = 1; j <= i; j++)
		{
			a[i][j] = a[i-1][j-1] + a[i-1][j];
		}
	}
	for(i = 0; i < N; i++)
	{
		/*for(j = 0; j < N - i ; j++)
			printf(" ");*/
		for(j = 0; j <= i; j++)
		{
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

總結

每一次請假面試,本身心裏都是崩潰的。仍是本身基礎不夠牢固!接下來,多看面試題,多看小算法~進程

相關文章
相關標籤/搜索