「不拘一格」不僅是軍事謀略,更是程式設計的核心思維。面對同一個問題——在螢幕列印 t 個星號(t ≤ 50),我們可以有截然不同的四種實作,各有優劣,適用場景不同。
void fun(int t) {
if (t < 0 || t > 50) return;
switch(t) {
case 1: printf("*"); break;
case 2: printf("**"); break;
// ... 寫到 case 50
}
}
優點:時間複雜度 O(1),極快。
缺點:程式碼極度膨脹,維護困難,屬於「劍走偏鋒」。
void fun(int t) {
if (t < 0 || t > 50) return;
for (int i = 0; i < t; i++) printf("*");
}
優點:邏輯清晰、程式碼簡潔、通用性強。
缺點:時間複雜度 O(t),頻繁呼叫 printf 有輸出開銷。
void fun(int t) {
if (t < 0 || t > 50) return;
char *p = "**************************************************"; // 50個*
char buf[51];
memcpy(buf, p, t);
buf[t] = 0;
printf(buf);
}
優點:時間複雜度 O(1),單次 printf 呼叫。
缺點:佔用額外靜態記憶體(p 與 buf)。
void fun(int t) {
if (t < 0 || t > 50) return;
char *p = (char*)malloc(t + 1);
if (!p) return;
memset(p, '*', t);
p[t] = 0;
printf(p);
free(p);
}
優點:空間按需分配,無靜態浪費。
缺點:增加 malloc/free 與 memset 開銷,雖仍屬 O(1) 但常數因子較大。
「不拘一格,不是要你寫什麼程式都劍走偏鋒,而是當普通路徑走不通或極難走時,嘗試另闢蹊徑。各演算法各有優劣與適用域,切勿一招打天下,也切勿為炫技而濫用不適合的演算法。」
這正是工程師思維的精髓:理解權衡,按場景選擇最優解。