LeetCode 402. 移掉K位数字 中等难度
402. 移掉K位數字
題目:
給定一個以字符串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。
注意:
num 的長度小于 10002 且 ≥ k。
num 不會包含任何前導零。
解題思路:
今天就不畫圖了,直接上了。可能會亂一點。
-
貪心算法 從左到右,如果前一位的數字大于后一位,那么判斷一下,比如41
如果不去掉前一位,去掉后一位 4
以及去掉后一位,不去掉前一位 1
判斷誰大 很明顯是第一種情況大,所以我們應該去掉后一位。
-
也就是兩兩之間比較,如果前一位大于后一位,那么我們就直接去掉前一位。
-
這里需要考慮的幾種情況,
1.如果前一位比后一位的數字大的情況不多,而且K很大的情況下,需要直接去掉數字的個位數,也就是堆頂
2.如何避免開頭的數字是0? 堆低的數字不能為0就行了
代碼1:
vector<int>_stack;string res="";for(int i=0;i<num.length();i++){int number=num[i]-'0';while(_stack.size()!=0&& k>0 && _stack.back()>number ) {_stack.pop_back();k--;}if(number!=0||_stack.size()>0){_stack.push_back(number);}}while(_stack.size()!=0&&k>0){_stack.pop_back();k--;}for(auto num:_stack) res += '0' + num;if(res=="") return "0";return res;代碼2:
vector<int>_stack;string res="";for(int i=0;i<num.length();i++){int number=num[i]-'0';while( k>0 &&_stack.back()>number&&_stack.size()!=0) {_stack.pop_back();k--;}if(number!=0||_stack.size()>0){_stack.push_back(number);}}while(_stack.size()!=0&&k>0){_stack.pop_back();k--;}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**前面。
以前覺的&&里的順序不重要,但是經過這道題目之后,以后寫&&里的條件順序的時候還是要判斷一下怎么寫比較合適。
總結
以上是生活随笔為你收集整理的LeetCode 402. 移掉K位数字 中等难度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 376. 摆动序列
- 下一篇: LeetCode 55. 跳跃游戏 中等