
py
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
if head.next is None:
return None
fast_point = head
while 0 < n and fast_point.next is not None:
fast_point = fast_point.next
n -= 1
if n != 0:
return head.next
slow_point = head
while fast_point.next is not None:
fast_point = fast_point.next
slow_point = slow_point.next
slow_point.next = slow_point.next.next
return head

如果n先小於零就是尺太短刪減某個元數至少要前後的next做連接,當尺太短就要自講想辦法刪除第一個或將倒數第二個接上nil。
也可以先遍歷一次求長度,本次使用快慢指針法。如圖就不多解釋了。
go
func removeNthFromEnd(head *ListNode, n int) *ListNode {
if head.Next == nil {
return nil
}
fastPoint := head
for ; 0 < n && fastPoint.Next != nil; n-- {
fastPoint = fastPoint.Next
}
if n != 0 {
return head.Next
}
slowPoint := head
for fastPoint.Next != nil {
fastPoint = fastPoint.Next
slowPoint = slowPoint.Next
}
slowPoint.Next = slowPoint.Next.Next
return head
}

線索太少,而且我英文不好。我已經想到兩種例外了。
一、"({)}"
二、"({})"
直接用console的Testcase看看。


恩。大致上釐清了。他只看前一個有沒有對起來。如果他是要找匹配的就比較麻煩了。這樣就要寫更多判斷式來解題。但不管他要哪種。這種類型我都會用stack下去解題。
py
class Solution:
def isValid(self, s: str) -> bool:
token_stack = []
for token in s:
if token == "{" or token == "(" or token == "[":
token_stack.append(token)
elif not token_stack:
return False
else:
if token == "}" and token_stack.pop() != "{":
return False
if token == "]" and token_stack.pop() != "[":
return False
if token == ")" and token_stack.pop() != "(":
return False
if token_stack:
return False
else:
return True
go
func isValid(s string) bool {
var tokenStack []int32
for _, token := range s {
if token == 123 || token == 91 || token == 40 {
tokenStack = append(tokenStack, token)
} else if len(tokenStack) == 0 {
return false
} else {
if tokenStack[len(tokenStack)-1] == 40 && token != 41 {
return false
}
if tokenStack[len(tokenStack)-1] == 91 && token != 93 {
return false
}
if tokenStack[len(tokenStack)-1] == 123 && token != 125 {
return false
}
tokenStack = tokenStack[:len(tokenStack)-1]
}
}
if len(tokenStack) == 0 {
return true
} else {
return false
}
}
以上,自己看吧,歡迎留言交流。