Re: [閒聊] 每日leetcode已回收

看板Marginalman作者 (南爹摳打)時間1年前 (2024/04/11 20:31), 編輯推噓0(001)
留言1則, 1人參與, 1年前最新討論串111/1548 (看更多)
※ 引述《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
文章代碼(AID): #1c5zWqD5 (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1c5zWqD5 (Marginalman)