1. 程式人生 > >利用哨兵簡化程式設計的一個小栗子

利用哨兵簡化程式設計的一個小栗子

// 在陣列 a 中,查詢 key,返回 key 所在的位置
// 其中,n 表示陣列 a 的長度
// 我舉 2 個例子,你可以拿例子走一下程式碼
// a = {4, 2, 3, 5, 9, 6}  n=6 key = 7
// a = {4, 2, 3, 5, 9, 6}  n=6 key = 6
int find(char* a, int n, char key) {
  if(a == null || n <= 0) {
    return -1;
  }
  
  // 這裡因為要將 a[n-1] 的值替換成 key,所以要特殊處理這個值
  if (a[n-1] == key) {
    return
n-1; } // 把 a[n-1] 的值臨時儲存在變數 tmp 中,以便之後恢復。tmp=6。 // 之所以這樣做的目的是:希望 find() 程式碼不要改變 a 陣列中的內容 char tmp = a[n-1]; // 把 key 的值放到 a[n-1] 中,此時 a = {4, 2, 3, 5, 9, 7} a[n-1] = key; int i = 0; // while 迴圈比起程式碼一,少了 i<n 這個比較操作 while (a[i] != key) { ++i; } // 恢復 a[n-1] 原來的值, 此時 a= {4, 2, 3, 5, 9, 6}
a[n-1] = tmp; if (i == n-1) { // 如果 i == n-1 說明,在 0...n-2 之間都沒有 key,所以返回 -1 return -1; } else { // 否則,返回 i,就是等於 key 值的元素的下標 return i; } }

把陣列最後一個值存一下,並替換成key。這樣遍歷陣列時就少了一個比較的過程:while(i<n)

現在只需要:

while (a[i] != key) {
    ++i;
  }
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
題 外

 如何鍛鍊寫連結串列能力?886有空的時候多實現幾次就行了

練習題LeetCode對應編號:206,141,21,19,876。