来自域外的视角

本文以外观数列为例,添加些许小手段,实现类似单链表 dummy效果,化特殊为普通

引言

算法边界处理,在域内视角很麻烦,不是漏条件了,就是写了一大堆相似处理逻辑,不甚优雅。

思路

将特殊的边界情况,转化为普通的元素,直接抹平。

外观数列

  • 双指针 i 先行,但末元素无法处理自身,因此末位添加一个字符串位$,合理越界修复
  • forfor range 两个世界,一个索引字节,条件检测会自决可变性,而后者循环副本,rune值输出

示例返回第n个外观数列字符串值

import "bytes"
import "strconv"
func countAndSay( n int ) string {
    rs := "1"
    var buf bytes.Buffer
    for ;n>1;n--{
        rs +="$"
        for k,i:=0,1;i< len(rs);i++{
            if rs[i-1]!=rs[i]{
                buf.WriteString(strconv.Itoa(i-k))
                buf.WriteByte(rs[i-1])
                k=i
            }
        }
        rs = buf.String()
        buf.Reset()
    }
    return rs
}

单链表dummy

单链表的元素删除,需要通过前驱元素操作,头节点由于不存在前驱,往往需要特殊对待。
用构建dummy结点,简化处理逻辑,将头节点当作普通节点操作即可,示例删除倒数第n个节点

func removeNthFromEnd( head *ListNode ,  n int ) *ListNode {
    dummy := &ListNode{
        Next: head,
    }
    slow,fast := dummy, dummy
    for fast != nil && fast.Next != nil{
        n--
        if n < 0 {
            slow = slow.Next
        }
        fast = fast.Next
    }
    slow.Next = slow.Next.Next
    return dummy.Next
}
  • 快慢指针找到被删除节点的前置节点
  • 用哨兵虚拟节点,解决原生链头操作bug
本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商