算法常用技巧

  • 哨兵位:

    常用在线性表的处理过程中,比如查找和移动数据操作
    两个作用:一个是作为一个临时存储空间使用,另一个是减少不必要的越界判断,简化算法代码复杂度

  • 巧用数组下标

  • 取余的用法:

    取余运算最常用的方法就是判断一个数能否被另一个数整除。
    余运算基本上还是一个除法运算,如果仅仅是判断奇偶数,判断(number & 1)是否等于 0 是更好的方法。

  • 一重循环遍历二维数组:

    一重循环遍历二维表关键是对下标的处理,对于一个 M × N 的二维表,可用以下方法解出对应的二维下标:

    int row = i / M
    int col = i % N

反过来,也可以用以下公式将二维坐标还原为一维坐标:

int i = row * N + col

棋盘(迷宫)类算法方向遍历:


图(1) 方向数组坐标偏移关系

向左搜索:行坐标 i 不变,列坐标 j-1
向上搜索:行坐标 i-1,列坐标不变
向右搜索:行坐标 i 不变,列坐标 j+1
向下搜索:行坐标 i+1,列坐标不变
根据以上关系,首先定义二维数组下标偏移量,然后定义一个偏移量数组,分别表示向四个方向的数组下标偏移量。

  • 单链表

    不使用额外存储节点的情况下使一个单链表的所有节点逆序可以采用递归的方法,也可以采用循环迭代的方法

    图(2)单链表逆序递归状态图
    递归方法的核心就是确定递归子问题,链表类的问题找递归子问题的方法基本固定,就是每次除去链表头部第一个节点,剩下的序列作为分解的子问题。主要的算法实现思路是先将当前的表头节点从链表中拆出来,然后对剩余的节点组成的子链表进行逆序,最后将当前的表头节点连接到新链表的尾部。

  • 利用英文字母的 ASCII 编码特点:

     ASCII 表中 26 个英文字母是连续的,断一个 char 是大写英文字母还是小写英文字母,就可以利用这种连续的特点,直接做范围判断:
    

    if ((c >= ‘a’) && (c <= ‘z’))
    {
    //c是小写字母
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值