日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 402. 移掉K位数字 中等难度

發布時間:2025/5/22 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 402. 移掉K位数字 中等难度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

402. 移掉K位數字

題目:
給定一個以字符串表示的非負整數 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

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

  • 貪心算法 從左到右,如果前一位的數字大于后一位,那么判斷一下,比如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呢?會給你報錯

runtime error: applying non-zero offset 18446744073709551612 to null pointer (stl_iterator.h)

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

//代碼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位数字 中等难度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。