思路:
這一題寫出來還算順利,不過主要得益於我看了題目的標籤,不然我可能不會採用棧/(ㄒoㄒ)/~~
我首先觀察題目所給的例子,然後在草稿紙上模擬一下整個過程,具體是這樣的:遇到比棧頂更大的元素就直接出棧,若比棧頂小則說明此時棧頂是棧中最大的元素,在k大於0的情況下棧頂出棧,知道當前元素滿足入棧條件:
stack
stack =
newstack
<
>()
;int i =0;
while
(i < num.
length()
)else
} stack.
add(num.
charat
(i))
; i++
;}
當然,退出這個while迴圈後k可能還是大於0的,那麼這時候直接讓棧頂出棧即可,因為棧頂就是最大的元素:
while
(k >0)
stringbuilder sb =
newstringbuilder()
;while
(!stack.
isempty()
) sb.
(stack.
pop())
; string str = sb.
reverse()
.tostring()
;
接下來去除頭部的0:
int p =0;
while
(p < str.
length()
&& str.
charat
(p)==
'0') p++
;
經過上面的去0操作,可能導致結果為空串,所以返回這裡再加乙個判斷:
return str.
substring
(p,str.
length()
).equals(""
)?"0":str.
substring
(p,str.
length()
);
完整**如下:
public string removekdigits
(string num,
int k)
else
} stack.
add(num.
charat
(i))
; i++;}
while
(k >0)
stringbuilder sb =
newstringbuilder()
;while
(!stack.
isempty()
) sb.
(stack.
pop())
; string str = sb.
reverse()
.tostring()
;int p =0;
while
(p < str.
length()
&& str.
charat
(p)==
'0') p++
;return str.
substring
(p,str.
length()
).equals(""
)?"0":str.
substring
(p,str.
length());}
實際上,不用棧也有更簡潔的解法,思路和使用棧是一樣的:從左到右,找第乙個比後面大的字元,刪除,清零,k次掃瞄。
public string removekdigits
(string num,
int k)
return s.
tostring()
;}
力扣 402移掉K位數字
題目描述 給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 12...
402 移掉K位數字
給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。示例...
402 移掉K位數字
給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。維護乙個單調遞增棧,解決拆開的最值問題 class solution q.offerlast num.charat i for int i 0 i k i stringbuffer sb newstringbuff...