加一:從簡單問題到復雜邊界的深度思考

加一:從簡單問題到復雜邊界的深度思考

引言

在算法世界里,有些問題看似簡單,實則暗藏玄機,其中“加一”問題就是一個典型例子。所謂“加一”,通常指的是給一個由數字組成的數組表示的整數加一,這聽起來簡單,但一旦遇到各種邊界情況,就變成了考驗代碼健壯性的試煉場。

今天,我們就從這個問題出發,分析不同的邊界情況,并通過多種解法讓這個簡單問題變得更具挑戰性!


一、問題描述

我們有一個非負整數,它以數組的形式存儲,例如:

[1, 2, 3]

表示的是整數 123,我們要對這個數加一,然后返回新的數組。例如:

輸入: [1, 2, 3]
輸出: [1, 2, 4]

看起來很簡單?但邊界情況可不少,比如:

  • 進位問題:如何處理 [9, 9, 9] 變成 [1, 0, 0, 0]
  • 長度變化:當所有數字都是 9,數組長度如何調整?
  • 空數組或異常輸入:如何保證代碼的魯棒性?

我們來一步步拆解這些情況!


二、基本解法

最直觀的做法是從數組末尾開始處理進位,直到找到不需要進位的數字:

def plus_one(digits):"""經典加一算法,從末尾開始處理進位問題"""for i in range(len(digits) - 1, -1, -1):  # 逆序遍歷if digits[i] < 9:  # 如果當前數字小于9,直接加一digits[i] += 1return digitsdigits[i] = 0  # 若等于9,則當前位變成0,繼續進位# 如果所有位都是9,進位后需要新添加一位1return [1] + digits# 示例測試
print(plus_one([1, 2, 3]))  # 輸出 [1, 2, 4]
print(plus_one([9, 9, 9]))  # 輸出 [1, 0, 0, 0]

這里,我們采用逆序遍歷,保證最少的計算量,同時使用 return 及時結束函數,減少不必要的循環。


三、特殊邊界情況分析

1. 處理全 9 進位

進位的極端情況是 [9, 9, 9] 變成 [1, 0, 0, 0],這個情況在我們的基本解法中已經妥善處理,即新數組首位加 1,其他位置變 0。

2. 處理空數組

如果輸入是 [],我們需要判斷:

def plus_one_safe(digits):if not digits:  # 處理空數組return [1]return plus_one(digits)print(plus_one_safe([]))  # 輸出 [1]

這樣保證了即使輸入異常,我們依然能正確處理。

3. 處理非整數輸入

如果數組內元素不全是數字,如 ["a", 2, 3],我們要檢查輸入:

def plus_one_validate(digits):if not all(isinstance(x, int) and x >= 0 for x in digits):  # 確保都是非負整數raise ValueError("輸入必須是非負整數數組")return plus_one(digits)print(plus_one_validate(["a", 2, 3]))  # 拋出異常

這樣可以防止程序崩潰,并幫助用戶理解輸入格式。


四、進階優化:使用大數計算

如果數組很長,比如 [9, 9, ..., 9](有 10000 個 9),直接進行數組運算效率較低,此時可以轉換成整數處理:

def plus_one_big(digits):num = int("".join(map(str, digits))) + 1  # 轉換為整數再加一return list(map(int, str(num)))  # 再轉回數組print(plus_one_big([9, 9, 9]))  # 輸出 [1, 0, 0, 0]

這個方法適用于大數計算,避免遍歷,直接操作字符串。


五、總結

這個看似簡單的“加一”問題,其實隱藏著多個邊界挑戰:

  • 需要考慮進位邏輯
  • 需要處理空數組
  • 需要防止非法輸入
  • 需要優化大數計算

不同的解法各有優劣:

解法優勢適用場景
基本解法邏輯清晰、處理進位常規數據
輸入校驗防止異常崩潰多種類型數據
大數計算處理超長數組需要高效計算

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

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

相關文章

PointCore——利用局部全局特征的高效無監督點云異常檢測器論文與算法解讀

概述 三維點云異常檢測旨在從訓練集中檢測出異常數據點&#xff0c;是工業檢測、自動駕駛等眾多應用的基礎。然而&#xff0c;現有的點云異常檢測方法通常采用多個特征存儲庫來充分保留局部和全局特征表示&#xff0c;這帶來了高昂的計算成本以及特征之間的不匹配問題。為解決…

桌面應用UI開發方案

一、基于 Web 技術的跨平臺方案 Electron Python/Go 特點&#xff1a; 技術棧&#xff1a;前端使用 HTML/CSS/JS&#xff0c;后端通過 Node.js 集成 Python/Go 模塊或服務。 跨平臺&#xff1a;支持 Windows、macOS、Linux 桌面端&#xff0c;適合開發桌面應用。 生態成熟&…

redis 配置日志和數據存儲位置

Redis配置日志和數據存儲位置 介紹 Redis是一個開源的高性能鍵值存儲數據庫&#xff0c;常用于緩存、消息隊列和實時分析等場景。在使用Redis時&#xff0c;我們需要配置日志和數據存儲位置&#xff0c;以便更好地管理和監控Redis的運行狀態。本文將介紹如何配置Redis的日志和數…

OSI七層網絡模型詳解

OSI七層網絡模型詳解 OSI&#xff08;開放系統互連&#xff09;模型是國際標準化組織&#xff08;ISO&#xff09;提出的網絡通信框架&#xff0c;旨在規范不同系統間的通信。它分為七層&#xff0c;每層承擔特定功能&#xff0c;協同實現端到端的數據傳輸。 1. 物理層&#x…

Springboot 學習 之 logback-spring.xml 日志打印

文章目錄 1. property2. springProperty3. appender4. logger4.1. 通過包路徑控制日志4.2. 通過類名控制日志4.3. 按自定義 Logger 名稱控制日志 5. root6. springProfile SpringBoot 項目中可以通過自定義 logback-spring.xml 中各項配置&#xff0c;實現日志的打印控制 1. p…

Gradle與Idea整合

文章目錄 1. Groovy 簡介2. Groovy 安裝[非必須]3. 在idea中創建java工程 1. Groovy 簡介 在某種程度上&#xff0c;Groovy可以被視為Java的一種腳本化改良版,Groovy也是運行在JVM上&#xff0c;它可以很好地與Java代碼及其相關庫進行交互操作。它是一種成熟的面向對象編程語言…

OpenFeign終極指南:超時控制、重試策略、攔截器與自定義Starter

目錄 前言 使用 引入依賴 開啟feign 編寫feign客戶端 效果 日志 超時配置 重試機制 攔截器 Fallback兜底返回 引入依賴 編寫兜底實現 連接池 引入依賴 開啟連接池 制作OpenFeign Starter 編寫配置類 自動裝配 前言 在RPC框架中&#xff0c;有openFeign和Du…

Windows桌面圖標變白的解決方案

一、問題原因 桌面圖標變白通常是由于系統圖標緩存文件&#xff08;IconCache.db&#xff09;損壞或系統圖表示現異常導致。圖標緩存是Windows用于存儲應用程序和文件夾圖標圖像的臨時文件&#xff0c;當該文件損壞或系統未正確更新緩存時&#xff0c;圖標會因無法加載原始圖像…

【mysql】Mac 通過 brew 安裝 mysql 、啟動以及密碼設置

Mac 通過 brew 安裝 mysql 、啟動以及密碼設置 使用 brew 安裝 mysqlmysql 啟動mysql密碼設置參考文章&#xff1a; 使用 brew 安裝 mysql brew install mysqlmysql 啟動 下載完畢&#xff0c;終端告訴我們mysql數據庫沒有設置密碼的&#xff0c;我們可以直接執行 mysql -u r…

Manus AI:突破多語言手寫識別技術壁壘之路

Manus AI與多語言手寫識別 討論Manus AI如何突破多語言手寫識別的技術壁壘。 寫一篇詳細的博客有重點有鏈接超詳細 Manus AI&#xff1a;突破多語言手寫識別技術壁壘之路 在人工智能領域&#xff0c;多語言手寫識別一直是極具挑戰性的難題。不同語言的字符形態、書寫規則大相…

Redis字符串類型實戰:解鎖五大高頻應用場景

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Redis的字符串&#xff08;String&#xff09;類型是最基礎的數據結構&#xff0c;但其靈活性和原子性操作使其成為解決高并發場景問題的利器。本文通過真實項…

邊沿耦合與寬邊耦合的串擾

邊沿耦合與寬邊耦合的串擾 我們知道&#xff0c;如果兩條走線位于同一層&#xff0c;由于耦合兩條線之間會存在串擾。如果PCB層疊中有相鄰的信號層&#xff0c;那么同樣存在耦合&#xff0c;這兩個相鄰信號層的走線之間也會存在串擾。同層走線之間的耦合稱為邊沿耦合&#xff0…

B端可視化像企業數據的透視鏡,看清關鍵信息

在數字化時代&#xff0c;數據已成為企業最寶貴的資產之一。然而&#xff0c;數據的價值不僅取決于其數量&#xff0c;更在于企業能否快速、準確地提取關鍵信息并據此做出決策。B端可視化技術的出現&#xff0c;為企業提供了一種強大的工具&#xff0c;它如同企業的“透視鏡”&…

蒼穹外賣項目中所涉及到的測試內容

1.使用JWT令牌封裝用戶令牌&#xff0c;并且設置相應的攔截器校驗JWT的有效性&#xff0c;從而確保了項目的安全可靠 1.基本功能測試&#xff1a; 驗證合法JWT是否能夠正常通過攔截器的校驗 驗證非法的JWT能否正常通過攔截器的校驗 2.可靠性測試&#xff1a; 3.易用性測試 …

模擬投資大師思維:AI對沖基金開源項目詳解

這里寫目錄標題 引言項目概述核心功能詳解多樣化的AI投資智能體靈活的運行模式透明的決策過程 安裝和使用教程環境要求安裝步驟基本使用方法運行對沖基金模式運行回測模式 應用場景和實際價值教育和研究價值潛在的商業應用與現有解決方案的對比局限性與發展方向 結論 引言 隨著…

YOLO拓展-錨框(anchor box)詳解

一.錨框&#xff08;anchor box&#xff09;概述 1.1什么是錨框 錨框就是一種進行預測的像素框&#xff0c;通過遍歷輸入圖像上所有可能的像素框&#xff0c;然后選出正確的目標框&#xff0c;并對位置和大小進行調整就可以完成目標檢測任務。 對于yolo錨框的建設須基于實際…

Excel自定義函數取拼音首字母

1.啟動Excel 2003&#xff08;其它版本請仿照操作&#xff09;&#xff0c;打開相應的工作表&#xff1b; 2.執行“工具 > 宏 > Visual Basic編輯器”命令&#xff08;或者直接按“AltF11”組合鍵&#xff09;&#xff0c;進入Visual Basic編輯狀態&#xff1b; 3.執行“…

Cril 截取字段-生成hostname

有些event 是不規則,需要用regular express 來加工一下, 下面說一下sample 數據: 2021-10-26 17:00:12 PDT sample log data from host eagle1 2021-10-26 17:00:12 PDT sample log data from host eagle2 2021-10-26 17:00:12 PDT sample log data from host eagle3 2021…

關于大型語言模型的“生物學”

我知道我們已經聊過很多次&#xff0c;關于LLM是怎么運作的&#xff0c;它們的影響力&#xff0c;還有它們的使用場景。但盡管現在有那么多講LLM的文章&#xff0c;它們本質上還是個黑箱。 但我們真正要問自己的問題是&#xff0c;為什么理解這些系統的內部結構很重要&#xf…

壓濾機與錫泥產生效率

的關系可從設備作用機制、工藝參數影響及效率評估方法三個維度展開&#xff0c;結合工業實踐與實驗室研究&#xff0c;其關聯邏輯如下&#xff1a; 一、壓濾機在錫泥處理中的核心作用 固液分離原理 壓濾機通過正壓強壓脫水、擠壓脫水、風吹脫水三步實現固液分離&#xff1a; …