有機(jī)會(huì)看到一個(gè)程式設(shè)計(jì)測試題,要通過題目給的測試案例(Example test cases)簡單,要通過正確性測試(Correctness test cases)有點(diǎn)難,要通過效能測試(Performance test cases)很難,在此記錄心得
測試題全測試項(xiàng)目通過會(huì)得到100分
題目:
輸入整數(shù)陣列A(int[] A),找到大於0並且不在A裡面,並且最接近0的正整數(shù),再回傳數(shù)值
A的可能長度,1~100000
A的內(nèi)容值,介於-1000000~1000000之間的整數(shù)
時(shí)間限制,30分鐘
心得:
1.題目和程式碼都能複製貼上,因此能在自己本機(jī)的開發(fā)環(huán)境上先寫程式和測試,再放到Codility
2.Codility上可以邊修改程式碼邊跑測試案例(Example test cases),但正確性測試(Correctness test cases)和效能測試(Performance test cases)是黑箱,是提交(Submit)後產(chǎn)生,無法再修改程式碼,只能看到測試結(jié)果和最後分?jǐn)?shù),不知道Codility實(shí)際做了甚麼測試
3.似乎只能是單執(zhí)行緒環(huán)境,起其他執(zhí)行緒跑測試案例會(huì)提示錯(cuò)誤
4.通過反覆觀察,正確性測試應(yīng)該是測試極限情況,A的長度為題目寫的1或100000,內(nèi)容值為-1000000或1000000,應(yīng)該都會(huì)被測試,因此這部分能在自己的開發(fā)環(huán)境上先模擬測試
5.要通過效能測試有點(diǎn)挑戰(zhàn)性,已知這部分就是要追求最快效能,因此程式碼就不用顧慮記憶體空間的使用或浪費(fèi),用空間換時(shí)間就對(duì)了
6.發(fā)考試的公司應(yīng)該會(huì)對(duì)不同題目設(shè)定不同時(shí)間,時(shí)間很趕,幫自己準(zhǔn)備能專心做答的環(huán)境再上去考試,中間被打斷應(yīng)該就是考試失敗
7.每個(gè)題目都先以完成測試案例為目標(biāo),再測試一下題目給的極值或邊界值,應(yīng)該就能通過正確性測試,效能測試看運(yùn)氣,在有限時(shí)間內(nèi)要立刻想到題目的效能最佳解不太容易,除非平常就在做這方面的工作,或是先找大量題目練習(xí),鍛鍊感覺
8.可以選擇程式語言做測試,常見的語言都有支援,但這部分應(yīng)該是看發(fā)考試的公司有沒有指定要用甚麼語言
以下暴雷測試題100分的程式碼,想自行挑戰(zhàn)的讀者請(qǐng)勿往下看
class Solution {
public int solution(int[] A) {
const int arrLength = 1000002; //通過極值測試發(fā)現(xiàn),方便給right = item + 1用
int[] _a = new int[arrLength]; //空間換時(shí)間
_a[1] = 1;
foreach (int item in A)
{
if (item <= 0)
{
continue;
}
_a[item] = 2;
int left = item - 1;
int right = item + 1;
if (left > 1 && _a[left] == 0)
{
_a[left] = 1;
}
if (_a[right] == 0)
{
_a[right] = 1;
}
}
for (int i = 1; i < arrLength; ++i)
{
if (_a[i] == 1)
{
return i;
}
}
return 1;
}
}