zoukankan      html  css  js  c++  java
  • 利用哨兵简化编程的一个小栗子

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

  • 相关阅读:
    【原创】禁止快播自动升级到最新版本,自己发现的方法
    又一灵异事件 Delphi 2007 在 Win7
    [DCC Error] E2161 Error: RLINK32: Error opening file "_____.drf"
    单例模式 改进
    estackoverflow with message 'stack overflow'
    所有可选的快捷键列表[转自万一博客]
    SQL server 除法运算
    正则表达式的一个坑[.\n]无效引起的血案
    getcwd()和__DIR__区别
    并发处理的技巧php
  • 原文地址:https://www.cnblogs.com/kazama/p/9951514.html
Copyright © 2011-2022 走看看