c c 機試中的 hash 問題

2021-09-11 11:36:51 字數 2170 閱讀 9609

先看乙個問題:要求先輸入數目 n , 再輸入 n 個數(取值範圍 0 到 100),n = 0 時程式結束,再輸入乙個值 a, 輸出 n 個數中與 a 相同的數字的個數。

面對這樣的問題,很容易想到的是將輸入的 n 個數先儲存起來,然後 將輸入的 n 與上述的 n 個數進行比較,cnt++ 的方式最終輸出胡個數,這裡介紹的是 hash 的方法,即在輸入 n 個數的同時,就將它們對應的個數進行儲存,hash[x]儲存的就是 x 的個數,最終只要輸出輸入的 a 的hash[a] 即可。

**為:

#include#include#include#include#include#includeusing namespace std;

int main()

; for (int i = 0; i < n; i++)

int a;

scanf("%d",&a);

printf("%d",hash[a]); }

return 0;

}

執行結果為:

3

90 80 60601

490 80 60 60602

490 80 60 90

601

再看第二個例子:

題目描述:

給你n個整數,請按從大到小的順序輸出其中前m大的數。

輸入:

每組測試資料有兩行,第一行有兩個數n,m(0,第二行包含n個各不相同,且都處於區間[-500000,500000]的整數。

輸出:

對每組測試資料按從大到小的順序輸出前m大的數。

樣例輸入:

53

3 -35 92 213 -644

樣例輸出:

213 92 3

注意的是輸入的 n 個數各不相同,要注意的是這裡最好不能用 sort, 因為 n 最大可能取到1000000,快排的時間複雜度為o(nlogn) , 會超出一秒的時間限制,這是可以考慮 hash 這種方法,即以空間換時間,因為儲存值以及遍歷一遍的時間複雜度最多為o(1),這樣可以大大提高程式的效率。

**為:

#include#include#include#include#include#includeusing namespace std;

//define後面不能加;會報錯!!!這也是前面程式出現錯誤的原因

#define offset 500000

//當分配較大陣列時就在函式外定義,共有100001個值

int hash[1000001];

int main()

的操作 for (int i = -500000; i <= 500000; i++)

hash[i + offset] = 0;

for (int i = 0; i < n; i++)

int cnt = 0;

for (int i = 500000; i >= -500000, cnt != m; i--)

else

printf(" ");

}}

} return 0;

}

執行結果:

6 2

100 300 400 10 20 301

400 301

5 33 -35 92 213 -644

213 92 3

c c 機試排版類問題

第一題,列印梯形 題目描述 輸入乙個高度h,輸出乙個高為h,上底邊為h的梯形。輸入 乙個整數h 1 h 1000 輸出 h所對應的梯形。樣例輸入 4 樣例輸出 這題比較簡單,為 include include include include include includeusing namespac...

座標移動 華為機試 C C

開發乙個座標計算工具,a表示向左移動,d表示向右移動,w表示向上移動,s表示向下移動。從 0,0 點開始移動,從輸入字串裡面讀取一些座標,並將最終輸入結果輸出到輸出檔案裡面。輸入 合法座標為a 或者d或者w或者s 數字 兩位以內 座標之間以 分隔。非法座標點需要進行丟棄。如aa10 a1a yad ...

表示數字 華為機試 C C

將乙個字元中所有出現的數字前後加上符號 其他字元保持不變 public static string marknum string pinstr 輸入乙個字串 字元中所有出現的數字前後加上符號 其他字元保持不變 示例1jkdi234klowe90a3jkdi 234 klowe 90 a 3 第九十一...