Leecode加一演算法與分析

2021-09-26 01:52:02 字數 1233 閱讀 9755

@leecode加一

本題是按簡單tag順序之**現的第乙個需要輸出陣列的題,話不多說,來看題幹:

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位, 陣列中每個元素只儲存單個數字。

示例 1:

輸入: [1,2,3]

輸出: [1,2,4]

解釋: 輸入陣列表示數字 123。

示例 2:

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

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

解釋: 輸入陣列表示數字 4321。

似乎平淡無奇的一道題,為什麼要了小白筆者那麼長的時間?並不是因為筆者歇筆兩周多變菜了,而是因為其中的操作細節和對於堆溢位之後的處理確實需要注意,請看**:

class

solution

if(m==-1

) digits[0]

=1;}

if(m>=0)

digits[m]++;

return digits;}}

;

那麼這樣乙份**的思路其實一目了然。我們寫著寫著就會發現,如果給定的數字是9,19,29,99,999這樣的數字,該怎麼操作呢?[9]會變成[1,0],[1,9]會變成[2,0],[9,9]則會變成[1,0,0],在數字交界處的很多9會加一位,其他的判斷則是在第乙個不是9的數字上加一,9都變成0。

那麼思路來了,第一種就是筆者的複雜思路,從最後乙個開始判斷,只要是9一律變0,一直判斷到整個陣列的首位,如果還是9,說明要加一位數了,否則判斷到第乙個不是9的數字進行加一就完事了;第二種方法就聰明多了,直接判斷第乙個不是9的數的位置,操作雖然類似,但省去了許多不需要的步驟在這裡就不搬**了。

咋一看這份**寫的十分常規,但其中有必須要注意的點:

首先,在寫while的判斷條件時,需注意要將m>=0的判斷寫在先,否則可能因為m已經等於-1而出現digits[-1]的堆溢位(陣列越界)的情況;

其次,在將整個vector陣列後移時,要先開闢乙個空間,因為即使是vector型別,如果沒有開闢新的空間,也和普通陣列沒有兩樣,所以digits.push_back(1)這句話就十分重要了,如果沒有這句,你會發現自己一直在堆溢位,於是開始找尋**的邏輯漏洞直到瘋掉也找不到;

最後,要注意在執行判斷後m分為的兩種情況分別是-1與不是-1,即是否是在數字的分界處的判斷,和0位的關係並不大。

陣列代表數字加一演算法

給定乙個非負整數組成的非空陣列,在該數的基礎上加一,返回乙個新的陣列。最高位數字存放在陣列的首位,陣列中每個元素只儲存乙個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2,3 輸出 1,2,4 解釋 輸入陣列表示數字 123。示例 2 輸入 4,3,2,1 輸出 4,...

演算法設計與分析 算法學基礎(一) 算法學概述

分類目錄 演算法設計與分析 總目錄 算法學基礎 二 分析演算法 算法學基礎 三 漸進記號 演算法定義的是計算過程,該過程取某個值或值的集合作為輸入並產生某個值或值的集合作為輸出。這樣演算法就是把輸入轉換成輸出的計算步驟的乙個序列。我們也可以把演算法看成是用於求解良說明的計算問題的工具。一般來說,問題...

每日一演算法

leetcode 75 號題 給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,...