Re: [閒聊] 每日leetcode已回收
※ 引述《JIWP (神楽めあ的錢包)》之銘言:
: 402. Remove K Digits
: 有一個array nums,裡面的元素都是非負數
: 現在要移除k個元素
: 請回傳再移除k個元素後最小的值
: 思路:
: 用一個stack儲存元素
: 當遇到nums[i]比目前stack最後的元素還小的時候
: 就把stack[len(stack)-1]Pop出來
: 一直重複這個動作,直到stack最後一個元素比nums[i]還小或是已經POP出k個元素
: 接著把nums[i] push到stack
: 就這樣掃過一次nums
: 接著如果還沒pop出k個元素就從stack的尾端繼續pop出來
: 記得要把stack前面的0給刪掉
: golang code:
: func removeKdigits(num string, k int) string {
: stack := []byte{}
: idx:=0
: for idx<len(num){
: for len(stack)>0 && num[idx]<stack[len(stack)-1] && k>0{
: stack=stack[:len(stack)-1]
: k--
: }
: stack=append(stack,num[idx])
: idx++
: }
: for k>0 && len(stack)>0{
: stack=stack[:len(stack)-1]
: k--
: }
: for len(stack)>1 && stack[0]=='0'{
: stack=stack[1:]
: }
: if len(stack)==0{
: return "0"
: }
: return string(stack)
: }
哭了
想法應該差不多...?
但我的code怎麼這麼長還這麼醜
救命
public class Solution {
public string RemoveKdigits(string num, int k) {
var stack = new Stack<char>();
for (int i=0; i<num.Length;)
{
if (stack.Count == 0)
{
stack.Push(num[i]);
i++;
continue;
}
if (num[i] >= stack.Peek())
{
stack.Push(num[i]);
i++;
continue;
}
stack.Pop();
k--;
if (k == 0)
{
return EraseStartZero(new string(stack.ToArray().Reverse().
ToArray()) + num.Substring(i));
}
}
while (k != 0)
{
stack.Pop();
k--;
}
return EraseStartZero(new string(stack.ToArray().Reverse().ToArray()))
;
}
string EraseStartZero(string s)
{
int startIndex = GetStartIndex(s);
if (startIndex == 0) return s;
if (startIndex == -1) return "0";
return s.Substring(startIndex);
}
int GetStartIndex(string s)
{
for (int i=0; i<s.Length; i++)
{
if (s[i] != '0') return i;
}
return -1;
}
}
--
(づ′・ω・)づ
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.158.160.52 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1712838708.A.345.html
→
04/11 20:32,
1年前
, 1F
04/11 20:32, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 111 之 1548 篇):