2012.9华为软件开发面试题
1. C語言結構體數據對齊
轉自:http://blog.csdn.net/tiany524/article/details/6295551
1.1 結構體數據對齊(沒有#pragma pack()宏定義)
結構體對齊可以總結為三個基本原則
①數據成員對齊規則:
結構體的數據成員中,第一個成員從offset為0的地址開始,以后每一個成員存儲的起始位置為該成員大小的整數倍(在win32中int為32bit也即4字節對齊)
②結構體作為成員:
如果一個結構體1作為另一個結構體2的數據成員,則在結構體2中結構體1要從1內部成員最大的整數倍地址開始存儲。
③結構體的總大小(sizeof):
為該結構體內部最大基本類型的整數倍,不足的要補齊,而不是簡單的所有成員的大小總和。
舉例說明
?
1 struct A 2 { 3 short a; 4 short b; 5 short c; 6 };sizeof(A)=6
1 struct B 2 { 3 long a; 4 short c; 5 };sizeof(B)=8
它的內存分配為: a1 a2 a3 a4 , c1 c2 x x(a1為a的第一個字節,x為補齊字節,下同)
?
1 struct C 2 { 3 int a; 4 char b; 5 short c; 6 };sizeof(C)=8
它的內存分配為: a1 a2 a3 a4, b1 x c1 c2(原則1)
?
?
1 struct D 2 { 3 char a; 4 int b; 5 short c; 6 };?
sizeof(D)=12
內存分配為: a1 x x x, b1 b2 b3 b4, c1 c2 x x
?
1 struct E 2 { 3 int a; 4 double b; 5 short c; 6 };sizeof(E)=24
內存分布a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x x
?
1 struct F 2 { 3 char a,b; 4 int c; 5 double d; 6 short e; 7 E h; 8 };sizeof(F)=48
內存分布
a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x x x, A的分布
?
?
1.2 加入#pragma pack()宏定義)
1 #pragma pack(1) 2 struct E 3 { 4 int a; 5 double b; 6 short c; 7 };sizeof(E)=14,為實際內存
VC對結構的存儲的特殊處理確實提高CPU存儲變量的速度,但是有時候也帶來了一些麻煩,我們也可以屏蔽掉變量默認的對齊方式,自己可以設定變量的對齊方式。
VC 中提供了 #pragma pack(n) 來設定變量以n字節對齊方式(n一般取1、2、4、8、16)。n字節對齊就是說變量存放的起始地址的偏移量有兩種情況:第一、如果n大于等于該變量所占用的字節數,那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節數,那么偏移量為n的倍數,不用滿足默認的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節數,那么結構的總大小必須為占用空間最大的變量占用的空間數的倍數; 否則必須為n的倍數。下面舉例說明其用法。
以上結構的大小為16,下面分析其存儲情況,首先為m1分配空間,其偏移量為0,滿足我們自己設定的對齊方式(4字節對齊),m1占用1個字節。接著開始為 m4分配空間,這時其偏移量為1,需要補足3個字節,這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大于n),m4占用8個字節。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3占用4個字節。這時已經為所有成員變量分配了空間,共分配了16個字節,滿足為n的倍數。如果把上面的#pragma pack(4)改為#pragma pack(16),那么我們可以得到結構的大小為24。
?
?
2. 約瑟夫環問題
http://baike.baidu.com/view/717633.htm
問題描述:n個人(編號0~(n-1)),從0開始報數,報到m-1的退出,剩下的人繼續從0開始報數。求勝利者的編號。
我們知道第一個人(編號一定是(m-1)%n) 出列之后,剩下的n-1個人組成了一個新的約瑟夫環(以編號為k=m%n的人開始):
k k+1 k+2 ... n-2,n-1,0,1,2,... k-2
并且從k開始報0。
現在我們把他們的編號做一下轉換:
k --> 0
k+1 --> 1
k+2 --> 2
...
...
k-3 --> n-3
k-2 --> n-2
變換后就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是最終的勝利者,那么根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎?!!
∵ k=m%n;
∴ x' = x+k = x+ m%n ; 而 x+ m%n 可能大于n
∴ x'= (x+m%n)%n = (x+m)%n
得到 x‘=(x+m)%n
令f表示i個人玩游戲報m退出最后勝利者的編號,最后的結果自然是f[n].
遞推公式:
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)
?
?
3. 求出小于n的最大素數,并做時間復雜度優化
?
4. 不限長的數據運算問題,字符數組模擬大數
?
?
?
轉載于:https://www.cnblogs.com/shenshanxiaoyao/archive/2012/09/08/2677094.html
總結
以上是生活随笔為你收集整理的2012.9华为软件开发面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyqt5 + pyinstaller
- 下一篇: Box 类