題目:
給定乙個以字串表示的非負整數 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 解釋 移...