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

利用哨兵簡化編程的一個小栗子

char 存在 else 實現 如果 代碼 返回 比較 mage

// 在數組 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。

利用哨兵簡化編程的一個小栗子