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