【華為機試】70. 爬樓梯

文章目錄

  • 70. 爬樓梯
    • 描述
    • 示例 1
    • 示例 2
    • 提示
    • 解題思路
      • 核心分析
      • 問題建模
      • 算法實現
        • 方法1:動態規劃(標準解法)
        • 方法2:空間優化動態規劃(最優解)
        • 方法3:遞歸 + 記憶化
        • 方法4:數學公式(斐波那契通項公式)
        • 方法5:矩陣快速冪
    • 復雜度分析
    • 核心要點
    • 數學推導
      • 遞推關系證明
      • 斐波那契數列對應關系
      • 通項公式推導
    • 執行流程圖
    • 實際應用
    • 擴展變形
    • 測試用例設計
    • 數學性質
      • 黃金比例的美
      • 奇偶性質
      • 整除性質
      • 平方和性質
    • 完整題解代碼

70. 爬樓梯

描述

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

示例 1

輸入:n = 2
輸出:2
解釋:有兩種方法可以爬到樓頂。

  1. 1 階 + 1 階
  2. 2 階

示例 2

輸入:n = 3
輸出:3
解釋:有三種方法可以爬到樓頂。

  1. 1 階 + 1 階 + 1 階
  2. 1 階 + 2 階
  3. 2 階 + 1 階

提示

  • 1 <= n <= 45

解題思路

核心分析

這是一道經典的動態規劃入門題目,本質上是斐波那契數列的變形。

問題建模

要到達第n階樓梯,可以從兩個位置到達:

  1. 從第(n-1)階爬1步
  2. 從第(n-2)階爬2步

因此:f(n) = f(n-1) + f(n-2)

這正是斐波那契數列的遞推關系!

算法實現

方法1:動態規劃(標準解法)

狀態定義

  • dp[i] 表示到達第i階樓梯的方法數
  • dp[i] = dp[i-1] + dp[i-2]

邊界條件

  • dp[1] = 1(只有一種方法:爬1步)
  • dp[2] = 2(兩種方法:1+1 或 2)
func climbStairs(n int) int {if n <= 2 {return n}dp := make([]int, n+1)dp[1] = 1dp[2] = 2for i := 3; i <= n; i++ {dp[i] = dp[i-1] + dp[i-2]}return dp[n]
}

時間復雜度:O(n)
空間復雜度:O(n)

方法2:空間優化動態規劃(最優解)

由于狀態轉移只依賴前兩個狀態,可以用兩個變量代替數組。

func climbStairsOptimized(n int) int {if n <= 2 {return n}prev2 := 1  // f(1)prev1 := 2  // f(2)for i := 3; i <= n; i++ {curr := prev1 + prev2prev2 = prev1prev1 = curr}return prev1
}

時間復雜度:O(n)
空間復雜度:O(1)

方法3:遞歸 + 記憶化

使用遞歸思路,配合記憶化避免重復計算。

func climbStairsMemo(n int) int {memo := make(map[int]int)return climbStairsMemoHelper(n, memo)
}func climbStairsMemoHelper(n int, memo map[int]int) int {if n <= 2 {return n}if val, exists := memo[n]; exists {return val}result := climbStairsMemoHelper(n-1, memo) + climbStairsMemoHelper(n-2, memo)memo[n] = resultreturn result
}

時間復雜度:O(n)
空間復雜度:O(n)

方法4:數學公式(斐波那契通項公式)

使用貝爾納公式直接計算斐波那契數列第n項。

func climbStairsFormula(n int) int {if n <= 2 {return n}sqrt5 := math.Sqrt(5)phi := (1 + sqrt5) / 2        // 黃金比例psi := (1 - sqrt5) / 2        // 共軛黃金比例// 斐波那契通項公式:F(n) = (φ^n - ψ^n) / √5// 但這里是 F(n+1),因為我們的序列是 f(1)=1, f(2)=2result := (math.Pow(phi, float64(n+1)) - math.Pow(psi, float64(n+1))) / sqrt5return int(math.Round(result))
}

時間復雜度:O(1)
空間復雜度:O(1)

方法5:矩陣快速冪

使用矩陣快速冪計算斐波那契數列,適合處理大數。

func climbStairsMatrix(n int) int {if n <= 2 {return n}// 轉換矩陣: [[1,1],[1,0]]base := [][]int{{1, 1}, {1, 0}}result := matrixPower(base, n-1)// result * [F(2), F(1)] = [F(n+1), F(n)]return result[0][0]*2 + result[0][1]*1
}func matrixPower(matrix [][]int, n int) [][]int {size := len(matrix)result := make([][]int, size)for i := range result {result[i] = make([]int, size)result[i][i] = 1  // 單位矩陣}base := make([][]int, size)for i := range base {base[i] = make([]int, size)copy(base[i], matrix[i])}for n > 0 {if n&1 == 1 {result = matrixMultiply(result, base)}base = matrixMultiply(base, base)n >>= 1}return result
}func matrixMultiply(a, b [][]int) [][]int {size := len(a)result := make([][]int, size)for i := range result {result[i] = make([]int, size)for j := 0; j < size; j++ {for k := 0; k < size; k++ {result[i][j] += a[i][k] * b[k][j]}}}return result
}

時間復雜度:O(log n)
空間復雜度:O(1)

復雜度分析

方法時間復雜度空間復雜度優缺點
標準DPO(n)O(n)思路清晰,易理解
空間優化DPO(n)O(1)最實用的解法 ?
記憶化遞歸O(n)O(n)自頂向下,遞歸棧開銷
數學公式O(1)O(1)最快,但有精度問題
矩陣快速冪O(log n)O(1)適合大數,復雜度低

核心要點

  1. 斐波那契本質:問題等價于求斐波那契數列第(n+1)項
  2. 狀態轉移:每個狀態只依賴前兩個狀態
  3. 空間優化:可以用O(1)空間代替O(n)空間
  4. 邊界處理:n=1和n=2的特殊情況

數學推導

遞推關系證明

f(n) 表示到達第n階樓梯的方法數:

遞推關系

f(n) = f(n-1) + f(n-2)  (n ≥ 3)

初始條件

f(1) = 1
f(2) = 2

證明
要到達第n階,只能從兩個位置到達:

  • 從第(n-1)階爬1步:有 f(n-1) 種方法
  • 從第(n-2)階爬2步:有 f(n-2) 種方法
  • 總計:f(n-1) + f(n-2) 種方法

斐波那契數列對應關系

爬樓梯序列:1, 2, 3, 5, 8, 13, 21, 34, …
斐波那契序列:1, 1, 2, 3, 5, 8, 13, 21, …

關系climbStairs(n) = fibonacci(n+1)

通項公式推導

斐波那契數列通項公式:

F(n) = (φ^n - ψ^n) / √5

其中:

  • φ = (1 + √5) / 2 ≈ 1.618(黃金比例)
  • ψ = (1 - √5) / 2 ≈ -0.618

因此:

climbStairs(n) = F(n+1) = (φ^(n+1) - ψ^(n+1)) / √5

執行流程圖

graph TDA[開始: 輸入n] --> B{邊界判斷}B -->|n ≤ 2| C[返回n]B -->|n > 2| D[選擇算法]D --> E[標準DP]D --> F[空間優化DP]D --> G[記憶化遞歸]D --> H[數學公式]D --> I[矩陣快速冪]E --> J[創建dp數組]F --> K[使用兩個變量]G --> L[遞歸+緩存]H --> M[黃金比例公式]I --> N[矩陣乘法]J --> O[循環計算f1-fn]K --> P[循環更新prev1,prev2]L --> Q[遞歸計算子問題]M --> R[直接計算結果]N --> S[快速冪計算]O --> T[返回dp[n]]P --> TQ --> TR --> TS --> TC --> U[結束]T --> U

實際應用

  1. 組合計數:計算特定約束下的方案數
  2. 路徑規劃:網格中的路徑計數問題
  3. 動態規劃優化:狀態壓縮的經典例子
  4. 算法面試:考察DP基礎的經典題目

擴展變形

  1. 步數擴展:如果可以爬1、2、3步怎么辦?
  2. 限制條件:某些臺階不能踩怎么處理?
  3. 成本問題:每步有不同成本,求最小成本
  4. 二維擴展:在網格中從左上到右下的路徑數

測試用例設計

// 基礎測試
n=11
n=22
n=33
n=45
n=58// 邊界測試
n=11 (最小值)
n=451836311903 (題目限制最大值)// 斐波那契驗證
n=1089
n=2010946
n=301346269// 性能測試
大數值測試各算法效率對比

數學性質

黃金比例的美

斐波那契數列中相鄰兩項的比值趨近于黃金比例φ:

lim(n→∞) F(n+1)/F(n) = φ = (1+√5)/2 ≈ 1.618

奇偶性質

F(n) 為偶數 ? n ≡ 0 (mod 3)

整除性質

gcd(F(m), F(n)) = F(gcd(m, n))

平方和性質

F(1)2 + F(2)2 + ... + F(n)2 = F(n) × F(n+1)

完整題解代碼

package mainimport ("fmt""math""time"
)// 方法1:動態規劃(標準解法)
func climbStairs(n int) int {if n <= 2 {return n}dp := make([]int, n+1)dp[1] = 1dp[2] = 2for i := 3; i <= n; i++ {dp[i] = dp[i-1] + dp[i-2]}return dp[n]
}// 方法2:空間優化動態規劃(最優解)
func climbStairsOptimized(n int) int {if n <= 2 {return n}prev2 := 1 // f(1)prev1 := 2 // f(2)for i := 3; i <= n; i++ {curr := prev1 + prev2prev2 = prev1prev1 = curr}return prev1
}// 方法3:遞歸 + 記憶化
func climbStairsMemo(n int) int {memo := make(map[int]int)return climbStairsMemoHelper(n, memo)
}func climbStairsMemoHelper(n int, memo map[int]int) int {if n <= 2 {return n}if val, exists := memo[n]; exists {return val}result := climbStairsMemoHelper(n-1, memo) + climbStairsMemoHelper(n-2, memo)memo[n] = resultreturn result
}// 方法4:數學公式(斐波那契通項公式)
func climbStairsFormula(n int) int {if n <= 2 {return n}sqrt5 := math.Sqrt(5)phi := (1 + sqrt5) / 2 // 黃金比例psi := (1 - sqrt5) / 2 // 共軛黃金比例// 斐波那契通項公式:F(n) = (φ^n - ψ^n) / √5// 這里是 F(n+1),因為我們的序列是 f(1)=1, f(2)=2result := (math.Pow(phi, float64(n+1)) - math.Pow(psi, float64(n+1))) / sqrt5return int(math.Round(result))
}// 方法5:矩陣快速冪
func climbStairsMatrix(n int) int {if n <= 2 {return n}// 標準斐波那契矩陣:[[1,1],[1,0]]// F(n) = [[1,1],[1,0]]^(n-1) 的第一行第一列// 爬樓梯問題:climbStairs(n) = F(n+1)base := [][]int{{1, 1}, {1, 0}}result := matrixPower(base, n)// result[0][0] = F(n+1), result[0][1] = F(n)return result[0][0]
}func matrixPower(matrix [][]int, n int) [][]int {size := len(matrix)result := make([][]int, size)for i := range result {result[i] = make([]int, size)result[i][i] = 1 // 單位矩陣}base := make([][]int, size)for i := range base {base[i] = make([]int, size)copy(base[i], matrix[i])}for n > 0 {if n&1 == 1 {result = matrixMultiply(result, base)}base = matrixMultiply(base, base)n >>= 1}return result
}func matrixMultiply(a, b [][]int) [][]int {size := len(a)result := make([][]int, size)for i := range result {result[i] = make([]int, size)for j := 0; j < size; j++ {for k := 0; k < size; k++ {result[i][j] += a[i][k] * b[k][j]}}}return result
}// 測試函數
func testClimbingStairs() {fmt.Println("=== 70. 爬樓梯測試 ===")testCases := []struct {name     stringn        intexpected int}{// 基礎測試用例{"示例1", 2, 2},{"示例2", 3, 3},{"示例3", 4, 5},{"示例4", 5, 8},// 邊界測試用例{"最小值", 1, 1},{"小值測試", 6, 13},// 斐波那契驗證{"斐波那契-10", 10, 89},{"斐波那契-15", 15, 987},{"斐波那契-20", 20, 10946},// 中等規模測試{"中等規模-25", 25, 121393},{"中等規模-30", 30, 1346269},// 大規模測試(接近題目限制){"大規模-40", 40, 165580141},{"最大值-45", 45, 1836311903},}methods := []struct {name stringfn   func(int) int}{{"標準DP", climbStairs},{"空間優化DP", climbStairsOptimized},{"記憶化遞歸", climbStairsMemo},{"數學公式", climbStairsFormula},{"矩陣快速冪", climbStairsMatrix},}for _, tc := range testCases {fmt.Printf("\n測試用例: %s (n=%d)\n", tc.name, tc.n)fmt.Printf("期望輸出: %d\n", tc.expected)for _, method := range methods {start := time.Now()result := method.fn(tc.n)duration := time.Since(start)status := "?"if result != tc.expected {status = "?"}fmt.Printf("%s %s: %d (耗時: %v)\n",status, method.name, result, duration)}}
}// 性能測試
func performanceTest() {fmt.Println("\n=== 性能測試 ===")testSizes := []int{10, 20, 30, 40, 45}methods := []struct {name stringfn   func(int) int}{{"標準DP", climbStairs},{"空間優化DP", climbStairsOptimized},{"記憶化遞歸", climbStairsMemo},{"數學公式", climbStairsFormula},{"矩陣快速冪", climbStairsMatrix},}for _, size := range testSizes {fmt.Printf("\n測試規模 n=%d:\n", size)for _, method := range methods {start := time.Now()result := method.fn(size)duration := time.Since(start)fmt.Printf("%s: 結果=%d, 耗時=%v\n",method.name, result, duration)}}
}// 算法分析
func algorithmAnalysis() {fmt.Println("\n=== 算法分析 ===")fmt.Println("時間復雜度:")fmt.Println("  ? 標準DP: O(n)")fmt.Println("  ? 空間優化DP: O(n)")fmt.Println("  ? 記憶化遞歸: O(n)")fmt.Println("  ? 數學公式: O(1) ? 最快")fmt.Println("  ? 矩陣快速冪: O(log n)")fmt.Println("\n空間復雜度:")fmt.Println("  ? 標準DP: O(n)")fmt.Println("  ? 空間優化DP: O(1) ? 最優實用")fmt.Println("  ? 記憶化遞歸: O(n)")fmt.Println("  ? 數學公式: O(1)")fmt.Println("  ? 矩陣快速冪: O(1)")fmt.Println("\n核心思想:")fmt.Println("  1. 斐波那契數列本質:f(n) = f(n-1) + f(n-2)")fmt.Println("  2. 狀態轉移:到達第n階只能從n-1或n-2階到達")fmt.Println("  3. 空間優化:只需要保存前兩個狀態")fmt.Println("  4. 數學加速:利用黃金比例直接計算")fmt.Println("\n推薦使用:")fmt.Println("  ? 面試/教學: 空間優化DP(平衡了效率和理解難度)")fmt.Println("  ? 高性能場景: 數學公式(需要注意浮點精度)")fmt.Println("  ? 大數場景: 矩陣快速冪(避免精度問題)")
}// 斐波那契數列分析
func fibonacciAnalysis() {fmt.Println("\n=== 斐波那契數列分析 ===")fmt.Println("爬樓梯與斐波那契的關系:")fmt.Printf("%-10s %-15s %-15s\n", "n", "climbStairs(n)", "fibonacci(n+1)")fmt.Println(repeatString("-", 45))for i := 1; i <= 10; i++ {climb := climbStairsOptimized(i)fib := fibonacci(i + 1)fmt.Printf("%-10d %-15d %-15d\n", i, climb, fib)}fmt.Println("\n黃金比例驗證:")for i := 5; i <= 15; i++ {fn := float64(climbStairsOptimized(i))fn1 := float64(climbStairsOptimized(i + 1))ratio := fn1 / fnphi := (1 + math.Sqrt(5)) / 2fmt.Printf("F(%d)/F(%d) = %.10f, φ = %.10f, 差值 = %.2e\n",i+1, i, ratio, phi, math.Abs(ratio-phi))}
}// 輔助函數:計算斐波那契數列
func fibonacci(n int) int {if n <= 2 {return 1}a, b := 1, 1for i := 3; i <= n; i++ {a, b = b, a+b}return b
}// 可視化演示
func visualDemo() {fmt.Println("\n=== 可視化演示 ===")n := 5fmt.Printf("示例: n = %d\n", n)fmt.Println("\n樓梯示意圖:")for i := n; i >= 1; i-- {spaces := repeatString(" ", (n-i)*2)fmt.Printf("%s[%d]\n", spaces, i)}fmt.Println(repeatString(" ", n*2) + "[0] 起點")fmt.Println("\n狀態轉移過程:")fmt.Println("f(1) = 1 (一種方法: 爬1步)")fmt.Println("f(2) = 2 (兩種方法: 1+1 或 2)")for i := 3; i <= n; i++ {prev1 := climbStairsOptimized(i - 1)prev2 := climbStairsOptimized(i - 2)curr := prev1 + prev2fmt.Printf("f(%d) = f(%d) + f(%d) = %d + %d = %d\n",i, i-1, i-2, prev1, prev2, curr)}fmt.Printf("\n最終答案: %d種方法\n", climbStairsOptimized(n))
}// 輔助函數:重復字符串
func repeatString(s string, count int) string {if count <= 0 {return ""}result := ""for i := 0; i < count; i++ {result += s}return result
}func main() {// 執行所有測試testClimbingStairs()performanceTest()algorithmAnalysis()fibonacciAnalysis()visualDemo()
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915411.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

山東大學軟件學院面向對象期末復習

面向對象 文章目錄面向對象04 類封裝接口 抽象類05 消息&#xff0c;實例化&#xff0c;靜態變量方法消息動/靜態類型語言對象創建類及實例具有下面特征對象數組的創建靜態數據成員構造函數06_0 繼承繼承是向下傳遞的JAVA為什么不支持多重繼承繼承的形式特殊化繼承替換原則規范…

讓 Windows 用上 macOS 的系統下載與保姆級使用教程

模擬蘋果桌面軟件下載&#xff1a;https://xpan.com.cn/s/8NFAGT 還記得 Windows 11剛發布時&#xff0c;很多人就說“果里果氣"的&#xff0c;但界面確實做的漂亮。 不知道現在有多少小伙伴正用著macOS&#xff0c;不過我敢確定&#xff0c;喜歡macOS的人絕對不少&#…

嵌入式硬件篇---繼電器

繼電器是一種通過小電流控制大電流的電磁開關&#xff0c;廣泛應用于自動化控制、電力系統和電子設備中。以下從工作原理、應用場景和電路特點三個方面詳細介紹&#xff1a;一、工作原理繼電器本質是電磁控制的機械式開關&#xff0c;核心部件包括&#xff1a;線圈&#xff08;…

鴻蒙網絡編程系列58-倉頡版TLS數字證書查看及驗簽示例

1. TLS數字證書驗簽簡介 數字證書的簽名驗證是網絡編程中一個重要的功能&#xff0c;它保證了數字證書是由可信任的簽發方簽署的&#xff0c;在此基礎上&#xff0c;我們才可以信任該證書&#xff0c;進而信任基于該證書建立的安全通道&#xff0c;所以說&#xff0c;數字證書…

【React Native】安裝配置 Expo Router

過去開發React Native&#xff0c;所使用的路由都是React Navigation。但是這個東西使用起來非常困難&#xff0c;配置無比繁瑣。Expo&#xff0c;為了簡化操作&#xff0c;就基于React Navigation開發了Expo Router。 Expo Router用起來就要簡單的多了&#xff0c;配置也相對…

美國VPS服務器Linux內核參數調優的實踐與驗證

美國vps服務器Linux內核參數調優的實踐與驗證在云計算和虛擬化技術日益普及的今天&#xff0c;美國VPS服務器因其穩定的網絡環境和優越的性價比&#xff0c;成為眾多企業和開發者的首選。Linux內核參數的默認配置往往無法充分發揮VPS的性能潛力。本文將深入探討美國VPS服務器上…

在Vscode中使用Kimi K2模型:實踐指南,三分鐘生成個小游戲

Kimi K2是一款基于多專家&#xff08;MoE&#xff09;架構的強大代碼與代理能力基礎模型。本文將通過在VS Code及其擴展Cline和RooCode中的實際應用&#xff0c;詳細說明如何使用Kimi K2-0711-preview模型。不得不說kimi這次的K2模型就是強大&#xff0c;在vscode中配置使用體驗…

基于SpringBoot+Uniapp球場預約小程序(騰訊地圖API、Echarts圖形化分析、二維碼識別)

“ &#x1f388;系統亮點&#xff1a;騰訊地圖API、Echarts圖形化分析、二維碼識別”01系統開發工具與環境搭建前后端分離架構 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17前端&#xff1a; 技術&#xff1a;框架Vue.js&#xff1b;UI庫&#xff1a;…

windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug調試

windows phpstorm 2024 phpstudy 8 php7.3 thinkphp6 配置xdebug調試 下載配置phpstudyPhp.ini配置phpstorm配置xdebug運行一會就停了配置虛擬機 0localhost_90.conf 配置php.ini配置下載 在下面地址下載合適的xdebug 放到對應的php https://xdebug.org/wizard 配置phpst…

python的pywebview庫結合Flask和waitress開發桌面應用程序簡介

pywebview的用途與特點 用途 pywebview是一個輕量級Python庫&#xff0c;用于創建桌面應用程序&#xff08;GUI&#xff09;。它通過嵌入Web瀏覽器組件&#xff08;如Windows的Edge/IE、macOS的WebKit、Linux的GTK WebKit&#xff09;&#xff0c;允許開發者使用HTML/CSS/Java…

C#通過HslCommunication連接西門子PLC1200,并防止數據跳動的通用方法

textEdit30.Text ReadValue<int>(() > plc.ReadInt32("DB57.DBD16"), ref _last_num).ToString();// 通用讀取方法&#xff08;支持所有值類型&#xff09;private T ReadValue<T>(Func<OperateResult<T>> readFunc, ref T lastValue) w…

Linux切換到Jenkins用戶解決Jenkins Host key verification failed

以root或sudo user身份, 切換到jenkins用戶 su -s /bin/bash jenkins前往jenkins的home目錄 cd /var/lib/jenkins/查看.ssh下是否已經有known_hosts, 有的話, 是什么內容, 正常情況下, 這時候是沒有對應IP記錄的 cd .ssh/ more known_hosts訪問一下對應IP, 記錄公鑰 ssh 192.16…

7.17 Java基礎 | 集合框架(下)

接上文&#xff1a; 7.16 Java基礎 | 集合框架&#xff08;上&#xff09;-CSDN博客 【1】Map集合 Map 集合是一種能存儲鍵值對的數據結構。它的主要功能是依據鍵&#xff08;Key&#xff09;來快速查找對應的值&#xff08;Value&#xff09; 1、聲明 Map<Integer,Integer…

【LeetCode刷題指南】--反轉鏈表,鏈表的中間結點,合并兩個有序鏈表

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

ubuntu上面的wps2019格式很亂在復制粘貼的時候

問題&#xff1a;在復制內容到 Ubuntu 上的 WPS 2019 出現如下問題&#xff1a;列表符號、換行和縮進錯亂&#xff0c;表現為每行前的點符號&#xff08;?&#xff09;變成不規則對齊或空格間距不統一。原因分析? 主要原因是&#xff1a;WPS 2019 在 Ubuntu 上的兼容性較差&a…

bws-rs:Rust 編寫的 S3 協議網關框架,支持靈活后端接入

bws-rs&#xff1a;Rust 編寫的 S3 協議網關框架&#xff0c;支持靈活后端接入 bws-rs介紹 bws-rs 是一個用 Rust 編寫的輕量級 S3 協議服務端網關框架&#xff0c;旨在幫助開發者快速構建兼容 AWS S3 協議 的對象存儲服務。該框架支持 S3 V4 簽名校驗&#xff0c;集成 Axum 作…

黑馬點評系列問題之p70postman報錯“服務器異常”

問題描述&#xff1a;在做這個位置的時候報錯報錯如下控制臺報錯如下解決根據控制臺的報錯來看&#xff0c;是?Redis模板未注入導致的空指針異常經過排查&#xff0c;原因是這里少了個Resource

Docker搭建Elasticsearch和Kibana

1.安裝docker&#xff0c;確保正常啟動 2.按步驟操作&#xff0c;這里的es是單節點的&#xff0c;如需多節點&#xff0c;需安裝docker-compose進行yml文件的編寫對容器進行編排 #docker拉鏡像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.2 docker pul…

【深度學習筆記 Ⅰ】3 step by step (jupyter)

1. 導包 import numpy as np import h5py import matplotlib.pyplot as plt from testCases_v2 import * from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward% matplotlib inline plt.rcParams[figure.figsize] (5.0, 4.0) # set default size of plo…

前端流式渲染流式SSR詳解

以下是關于前端流式渲染及流式SSR&#xff08;Server-Side Rendering&#xff09;的詳細解析&#xff0c;結合核心原理、技術實現、優化策略及實際應用場景展開說明&#xff1a;?? 一、流式渲染基礎原理 核心概念 ? 流式渲染&#xff1a;數據通過分塊傳輸&#xff08;Chunke…