2013/08/13,秋季校招準備工作第二天。
題目:
將乙個長度為
n的陣列隨機打亂。
解答:
思路:將陣列內的每個元素與它所在位置到結尾之間的乙個隨機位置的元素交換:
void shuffle(int *data, int n)
題目:
輸入正整數m、
n,向指定陣列中填充m個
[0,n-1]
的不重複的隨機數。如果
m>n
,只輸出
n個隨機數。
解答:
方法
1:將已經產生的隨機數儲存在乙個列表中,以後每產生乙個隨機數就在列表中查詢是否重複,如果重複則重新產生隨機數。
缺點:最壞情況下執行時間很長,在
m/n較大的時候難以估計這個時間。
優點:**簡單,方法直觀,適合
m/n很小的情況。方法2
:產生乙個長度為
n的臨時陣列
temp
,且temp[i]=i
,然後將
temp
打亂,取前
m個填到指定陣列中。
void randomfill(int *dest, int n, int m)
缺點:空間複雜度為
o(n)
,時間複雜度為
o(m+n)
,在m/n
較小時開銷較大。
優點:在
m/n較大時能保證線性時間內執行完畢。方法3
:0到n-1這n
個數,每個數被選中的概率都是
m/n,而
rand()%n的概率正好是
m/n,利用這個性質,我們得到下面的**:
void randomfill(int *dest, int n, int m)
shuffle(dest, j);
}
迴圈中的
m是還要挑
m個數,n是有
n個數可以挑,如果數
i被挑中,則
m需要減
1,而無論
i有沒有被挑中,可挑數的個數都需要減1。
缺點:方法不太直觀。
優點:空間複雜度
o(1)
,時間複雜度
o(n)
。效能在三種方法中最好。
題目:
有結構體
athlete
:struct athlete
,對此結構體按
speed
和name
項分別進行排序。要求利用庫函式
qsort
。解答:
要使用qsort
函式先要引入標頭檔案
stdlib.h
,它的原型為:
void qsort(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*));
重點是第四個引數,即自定義的排序規則,對於此題,我們需要兩個函式作為不同的排序規則:
int cmpspeed(const void *a,const void *b)
int cmpname(const void *a,const void *b)
qsort
規定了作為排序規則的函式的引數,因此我們需要在實際處理前將
void*
引數轉換為它實際型別的指標,然後再根據自己的需要返回乙個值,如果返回值為負數,則
a,如果返回值為0,則
a=b。
排序主函式為:
athlete list=, , , , ,
, , , , , ,
, , , };
int n = sizeof(list) / sizeof(athlete);
qsort(list, n, sizeof(athlete), cmpspeed);
qsort(list, n, sizeof(athlete), cmpname);
校招季 程式設計題目(14) 逆序數
題目 計算乙個全由大寫字母組成的字串的逆序數。解答 求逆序數和排序的思路是類似的,穩定的排序演算法都可以用來計算逆序數。方法1 最直接的方法,採用氣泡排序和插入排序的思路,一共需要遍歷 n 1 n 2 次,比較慢。方法2 利用歸併排序的思想加速這個過程。乙個序列的逆序數等於它的兩個遞迴子過程產生的逆...
校招季總結
忙碌的校招季告一段度,研究生階段的兩大任務,畢業和擇業已經完成了乙個,結果還算滿意,面了10家公司,拿到3個offer,對忙碌的乙個多月做乙個總結,挑戰,才剛剛開始。1.中興提前批 七月十五號,中興率先拉開了校招大幕,此次提前批主要針對參加過中興大賽的優勝同學,我抱著打醬油的態度也去試了試,結果真的...
校招季 Python筆記二
1.有六種內建序列 列表 元組 字串 unicode 字串 buffer 物件和xrange 物件。2.列表可以修改,元組不可以。一般可用列表代替元組,除了用作字典的鍵。列表用 標識。3.通用的序列操作包括 索引 分片 加 乘 包含某序列。4.序列的正序號從 0開始向右,負序號從 1開始向左。x 4...