先看乙個問題:要求先輸入數目 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 個數各不相同,要注意的是這裡最好不能用 sort, 因為 n 最大可能取到1000000,快排的時間複雜度為o(nlogn) , 會超出一秒的時間限制,這是可以考慮 hash 這種方法,即以空間換時間,因為儲存值以及遍歷一遍的時間複雜度最多為o(1),這樣可以大大提高程式的效率。給你n個整數,請按從大到小的順序輸出其中前m大的數。
輸入:
每組測試資料有兩行,第一行有兩個數n,m(0,第二行包含n個各不相同,且都處於區間[-500000,500000]的整數。
輸出:
對每組測試資料按從大到小的順序輸出前m大的數。
樣例輸入:
53
3 -35 92 213 -644
樣例輸出:
213 92 3
**為:
#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 第九十一...