首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

VBScript 陣列循環位移演算法:字串分割、旋轉矩陣輸出多種實作

     編輯:Java 相關知識

本文解決經典字串旋轉問題:給定分隔符分隔的字串 "a|b|c|d",輸出所有循環位移組合。提供四種 VBScript 實作,從雙重迴圈、模運算優化、Join 整合到極簡單行版本,展示演算法思維演進。

問題定義

輸入: "a|b|c|d"
輸出:
a|b|c|d
b|c|d|a
c|d|a|b
d|a|b|c

實作一:標準雙重迴圈 (最直觀)

str = "a|b|c|d"
Call Sort(str, "|")

Function Sort(sSource, sDelimiter)
    Dim I, J, N, sItems, sTemp
    sItems = Split(sSource, sDelimiter)
    For I = 0 To UBound(sItems)
        For J = 0 To UBound(sItems)
            N = I + J
            If N > UBound(sItems) Then
                N = N - UBound(sItems) - 1
            End If
            sTemp = sTemp & sItems(N) & sDelimiter
        Next
        sTemp = Left(sTemp, Len(sTemp) - Len(sDelimiter))
        Wscript.Echo sTemp
        sTemp = ""
    Next
End Function

實作二:模運算優化 + 陣列收集 (可一次性輸出)

str = "a|b|c|d"
WSH.Echo Join(Sort(str, "|"), vbCrLf)

Function Sort(ByVal s, ByVal d)
    Dim a, r(), i, j, h, index
    a = Split(s, d)
    h = UBound(a)
    ReDim Preserve r(h)
    index = Len(d) + 1

    For i = 0 To h
        r(i) = ""
        For j = i To h + i
            r(i) = r(i) & d & a(j Mod (h + 1))
        Next
        r(i) = Mid(r(i), index) ' 移除前導分隔符
    Next
    Sort = r
End Function

實作三:單一函數直接輸出字串 (簡潔)

str = "a|b|c|d"
Wscript.Echo Sort(str, "|")

Function Sort(sSource, sDelimiter)
    Dim I, J, N, sItems, sTemp
    sItems = Split(sSource, sDelimiter)
    N = UBound(sItems)
    For I = 0 To N
        For J = 0 To N
            sTemp = sTemp & sItems((I + J) Mod (N + 1)) & sDelimiter
        Next
        sTemp = Left(sTemp, Len(sTemp) - Len(sDelimiter))
        Sort = Sort & sTemp & vbCrLf
        sTemp = ""
    Next
    Sort = Left(Sort, Len(Sort) - 1) ' 移除末尾換行
End Function

實作四:極簡單行版 (InStr 尋找分隔符位置)

str = "a|b|c|d"
msgbox Sort(str, "|")

Function sort(ss, sd)
    Dim n, i
    For i = 0 To UBound(Split(ss, sd))
        sort = sort + Mid(ss + sd + ss, n + 1, Len(ss)) + vbCrLf
        n = InStr(n + 1, ss + sd + ss, sd)
    Next
End Function

演算法核心邏輯解析

實作核心技巧時間複雜度空間複雜度
雙重迴圈 + 邊界檢查If N > UBound Then N = N - UBound - 1 手動循環O(n²)O(n) 輸出緩衝
模運算 Mod (n+1)數學循環索引,無需分支O(n²)O(n²) 陣列儲存
字串拼接 (I+J) Mod (N+1)單一迴圈變數,直接輸出O(n²)O(n²) 字串累加
InStr 尋找分隔符ss+sd+ss 雙倍字串中找下一分隔符位置O(n²)O(n²) 字串累加

Java / Python 等價實作 (現代語言參考)

// Java 版
public static List rotate(String input, String delimiter) {
    String[] items = input.split(Pattern.quote(delimiter));
    List result = new ArrayList<>();
    for (int i = 0; i < items.length; i++) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < items.length; j++) {
            if (j > 0) sb.append(delimiter);
            sb.append(items[(i + j) % items.length]);
        }
        result.add(sb.toString());
    }
    return result;
}

// Python 版
def rotate(input_str, delimiter):
    items = input_str.split(delimiter)
    return [delimiter.join(items[i:] + items[:i]) for i in range(len(items))]

關鍵觀察與教學價值

  • 模運算 (Modulo) 是循環索引的數學本質:(i + j) % n 完美替代手動邊界檢查
  • 字串雙倍技巧:ss + sd + ss 使循環結構線性化,配合 InStr/indexOf 尋找分隔符
  • 分隔符長度可變:實作二、三正確處理多字元分隔符 (如 "::")
  • 輸出格式分離:實作二將生成邏輯與輸出分離 (回傳陣列),符合單一職責

應用場景延伸

  • 循環排程 / 輪詢負載均衡 (Round Robin)
  • 環狀緩衝區索引計算
  • 密碼學循環移位
  • 遊戲開發:回合制順序輪換
  • 字串最小表示法 (Booth 演算法) 相關問題

原文標題錯誤提示:原標題為「java應用回溯法求解數獨示例」,但實際內容為 VBScript 字串循環位移演算法。本文已依實際內容重寫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved