利用哨兵简化编程的一个小栗子

Posted 风间6324

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用哨兵简化编程的一个小栗子相关的知识,希望对你有一定的参考价值。

// 在数组 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。

以上是关于利用哨兵简化编程的一个小栗子的主要内容,如果未能解决你的问题,请参考以下文章

代码重构(OOP)-小栗子(PyQt5)

python面向对象(封装继承多态)+ 面向对象小栗子

小丸子函数式编程初探

把微信小程序异步API为Promise,简化异步编程

一个小栗子聊聊JAVA泛型基础

为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args