LeetCode 402 移掉K位數字 中等難度

2021-10-25 03:18:42 字數 2256 閱讀 6096

題目:

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。

注意:num 的長度小於 10002 且 ≥ k。

num 不會包含任何前導零。

示例 1

:輸入: num =

"1432219"

, k =

3輸出:

"1219"

解釋: 移除掉三個數字 4,3

, 和 2 形成乙個新的最小的數字 1219。

示例 2

:輸入: num =

"10200"

, k =

1輸出:

"200"

解釋: 移掉首位的 1 剩下的數字為 200. 注意輸出不能有任何前導零。

示例 3

:輸入: num =

"10"

, k =

2輸出:

"0"解釋: 從原數字移除所有的數字,剩餘為空就是0。

解題思路:今天就不畫圖了,直接上了。可能會亂一點。

判斷誰大 很明顯是第一種情況大,所以我們應該去掉後一位。

**1:

vector<

int>_stack;

string res="";

for(

int i=

0;ilength()

;i++)if

(number!=

0||_stack.

size()

>0)

}while

(_stack.

size()

!=0&&k>0)

for(

auto num:_stack) res +

='0'

+ num;

if(res=="")

return

"0";

return res;

**2:

vector_stack;

string res="";

for(int i=0;i

);i++)

if(number!=0||_stack.size(

)>0)

} while(_stack.size(

)!=0&&k>0)

for(auto num:_stack) res +=

'0' + num;

if(res=="")

return

"0";

return res;

重點來了**1可以漂亮通過,結果如下

但是**2呢?會給你報錯

簡單來說錯誤就是對空指標應用非零偏移量。接著我們來看看這兩小段**的區別

//**1片段

while(_stack.size(

)!=0&& k>0 && _stack.back(

)>number )

//**2片段

while( k>0 &&_stack.back(

)>number&&_stack.size(

)!=0)

接下來我們來分析分析這兩者之間的區別,其實就是判斷條件的未知不同而已

我們看看報錯**2片段

首先我們會先判斷k,如果不符合,根據&&的短路性直接跳出,但是如果符合就會進行下一步判斷,判斷——stack.back()>number,也就是vector尾的數跟number比較,但是這裡可能會出現vector為空的情況,那stack.back()就會出錯,那麼就會直接報錯。為了消除這個錯誤,我們必須提前判斷vector是否為空。也就是**_stack.size()!=0要放在stack.back()>number**前面。

以前覺的&&裡的順序不重要,但是經過這道題目之後,以後寫&&裡的條件順序的時候還是要判斷一下怎麼寫比較合適。

leetcode402移掉K位數

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。思路...

LeetCode 402 移掉K位數字

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。示例...

LeetCode 402 移掉K位數字

題目鏈結 題目描述 給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 示例 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。輸入 num 10200 k 1 輸出 200 解釋 移...