來自域外的視角

pardon110發表於2020-09-29

本文以外觀數列為例,新增些許小手段,實現類似單連結串列 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 協議》,轉載必須註明作者和本文連結

相關文章