1. 程式人生 > 其它 >LeetCode部分題解(二)

LeetCode部分題解(二)

技術標籤:LeetCodeleetcode

LeetCode部分題解(二)

1、[237. 刪除連結串列中的節點

請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點。傳入函式的唯一引數為 要被刪除的節點 。

現有一個連結串列 – head = [4,5,1,9],它可以表示為:

https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/01/19/237_example.png

示例 1:

輸入:head = [4,5,1,9], node = 5
輸出:[4,1,9]
解釋:給定你連結串列中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 1 -> 9.
示例 2:

輸入:head = [4,5,1,9], node = 1
輸出:[4,5,9]

解釋:給定你連結串列中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 5 -> 9.

提示:

連結串列至少包含兩個節點。
連結串列中所有節點的值都是唯一的。
給定的節點為非末尾節點並且一定是連結串列中的一個有效節點。
不要從你的函式中返回任何結果。

之前寫過一樣的題,把本節點變成下一個節點,然後刪除下一個節點即可

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution: def deleteNode(self, node): """ :type node: ListNode :rtype: void Do not return anything, modify node in-place instead. """ node.val = node.next.val node.next = node.next.next

2、[1603. 設計停車系統

請你給一個停車場設計一個停車系統。停車場總共有三種不同大小的車位:大,中和小,每種尺寸分別有固定數目的車位。

請你實現 ParkingSystem 類:

ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 類,三個引數分別對應每種停車位的數目。
bool addCar(int carType) 檢查是否有 carType 對應的停車位。 carType 有三種類型:大,中,小,分別用數字 1, 2 和 3 表示。一輛車只能停在 carType 對應尺寸的停車位中。如果沒有空車位,請返回 false ,否則將該車停入車位並返回 true 。

示例 1:

輸入:
[“ParkingSystem”, “addCar”, “addCar”, “addCar”, “addCar”]
[[1, 1, 0], [1], [2], [3], [1]]
輸出:
[null, true, true, false, false]

解釋:
ParkingSystem parkingSystem = new ParkingSystem(1, 1, 0);
parkingSystem.addCar(1); // 返回 true ,因為有 1 個空的大車位
parkingSystem.addCar(2); // 返回 true ,因為有 1 個空的中車位
parkingSystem.addCar(3); // 返回 false ,因為沒有空的小車位
parkingSystem.addCar(1); // 返回 false ,因為沒有空的大車位,唯一一個大車位已經被佔據了

提示:

0 <= big, medium, small <= 1000
carType 取值為 1, 2 或 3
最多會呼叫 addCar 函式 1000 次

就是模擬整個過程,按照要求寫下程式碼即可

class ParkingSystem:

    def __init__(self, big: int, medium: int, small: int):
        self.big = big
        self.medium = medium
        self.small = small

    def addCar(self, carType: int) -> bool:
        if carType == 3:
            if self.small != 0:
                self.small -= 1
                return True
            else: 
                return False 
        if carType == 2:
            if self.medium != 0:
                self.medium -= 1
                return True
            else: 
                return False 
        if carType == 1:
            if self.big != 0:
                self.big -= 1
                return True
            else: 
                return False 

# Your ParkingSystem object will be instantiated and called as such:
# obj = ParkingSystem(big, medium, small)
# param_1 = obj.addCar(carType)

3、1108. IP 地址無效化

給你一個有效的 IPv4 地址 address,返回這個 IP 地址的無效化版本。

所謂無效化 IP 地址,其實就是用 “[.]” 代替了每個 “.”。

示例 1:

輸入:address = “1.1.1.1”
輸出:“1[.]1[.]1[.]1”
示例 2:

輸入:address = “255.100.50.0”
輸出:“255[.]100[.]50[.]0”

提示:

給出的 address 是一個有效的 IPv4 地址

這道題如果我們一個一個去遍歷可能還要花點功夫,如果我們使用replace函式,就又是一個一行秒

class Solution:
    def defangIPaddr(self, address: str) -> str:
        return address.replace('.','[.]')

4、1678. 設計 Goal 解析器

請你設計一個可以解釋字串 command 的 Goal 解析器 。command 由 “G”、"()" 和/或 “(al)” 按某種順序組成。Goal 解析器會將 “G” 解釋為字串 “G”、"()" 解釋為字串 “o” ,"(al)" 解釋為字串 “al” 。然後,按原順序將經解釋得到的字串連線成一個字串。

給你字串 command ,返回 Goal 解析器 對 command 的解釋結果。

示例 1:

輸入:command = “G()(al)”
輸出:“Goal”
解釋:Goal 解析器解釋命令的步驟如下所示:
G -> G
() -> o
(al) -> al
最後連線得到的結果是 “Goal”
示例 2:

輸入:command = “G()()()()(al)”
輸出:“Gooooal”
示例 3:

輸入:command = “(al)G(al)()()G”
輸出:“alGalooG”

提示:

1 <= command.length <= 100
command 由 “G”、"()" 和/或 “(al)” 按某種順序組成

這道題和上道題一樣,直接替換解決

class Solution:
    def interpret(self, command: str) -> str:
        comand = command.replace('()','o')
        return comand.replace('(al)','al')

5、LCP 06. 拿硬幣

桌上有 n 堆力扣幣,每堆的數量儲存在陣列 coins 中。我們每次可以選擇任意一堆,拿走其中的一枚或者兩枚,求拿完所有力扣幣的最少次數。

示例 1:

輸入:[4,2,1]

輸出:4

解釋:第一堆力扣幣最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,總共 4 次即可拿完。

示例 2:

輸入:[2,3,10]

輸出:8

限制:

1 <= n <= 4
1 <= coins[i] <= 10

這道題也是按照他的要求,奇數先拿一枚變偶數,偶數一次拿兩枚即可

class Solution:
    def minCount(self, coins: List[int]) -> int:
        ans = 0
        for coin in coins:
            ans += int(coin / 2)
            ans += coin % 2
        return ans

6、1684. 統計一致字符串的數目

給你一個由不同字元組成的字串 allowed 和一個字串陣列 words 。如果一個字串的每一個字元都在 allowed 中,就稱這個字串是 一致字符串 。

請你返回 words 陣列中 一致字符串 的數目。

示例 1:

輸入:allowed = “ab”, words = [“ad”,“bd”,“aaab”,“baa”,“badab”]
輸出:2
解釋:字串 “aaab” 和 “baa” 都是一致字符串,因為它們只包含字元 ‘a’ 和 ‘b’ 。
示例 2:

輸入:allowed = “abc”, words = [“a”,“b”,“c”,“ab”,“ac”,“bc”,“abc”]
輸出:7
解釋:所有字串都是一致的。
示例 3:

輸入:allowed = “cad”, words = [“cc”,“acd”,“b”,“ba”,“bac”,“bad”,“ac”,“d”]
輸出:4
解釋:字串 “cc”,“acd”,“ac” 和 “d” 是一致字符串。

提示:

1 <= words.length <= 104
1 <= allowed.length <= 26
1 <= words[i].length <= 10
allowed 中的字元 互不相同 。
words[i] 和 allowed 只包含小寫英文字母。

這道題如果我們一個一個去匹配同樣是比較麻煩的,所以這裡我們可以用python中的集合中元素不重複的特點,只需找出所有子集即可

class Solution:
    def countConsistentStrings(self, allowed: str, words: List[str]) -> int:
        ans = 0
        for word in words:
            if set(allowed).issuperset(set(word)):
                ans+=1
        return ans

7、535. TinyURL 的加密與解密

TinyURL是一種URL簡化服務, 比如:當你輸入一個URL https://leetcode.com/problems/design-tinyurl 時,它將返回一個簡化的URL http://tinyurl.com/4e9iAk.

要求:設計一個 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密演算法如何設計和運作是沒有限制的,你只需要保證一個URL可以被加密成一個TinyURL,並且這個TinyURL可以用解密方法恢復成原本的URL。

這道題的判題是有些問題的,他只看加密並解密之後結果是否和之前一致,所以哪怕我們什麼都不做都可以AC的,當然這道題我們也可以設計自己的密碼來過,還是比較開放的

class Codec:

    def encode(self, longUrl: str) -> str:
        """Encodes a URL to a shortened URL.
        """
        return longUrl

    def decode(self, shortUrl: str) -> str:
        """Decodes a shortened URL to its original URL.
        """
        return shortUrl
        

# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.decode(codec.encode(url))

8、807. 保持城市天際線

在二維陣列grid中,grid[i][j]代表位於某處的建築物的高度。 我們被允許增加任何數量(不同建築物的數量可能不同)的建築物的高度。 高度 0 也被認為是建築物。

最後,從新陣列的所有四個方向(即頂部,底部,左側和右側)觀看的“天際線”必須與原始陣列的天際線相同。 城市的天際線是從遠處觀看時,由所有建築物形成的矩形的外部輪廓。 請看下面的例子。

建築物高度可以增加的最大總和是多少?

例子:
輸入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
輸出: 35
解釋:
The grid is:
[ [3, 0, 8, 4],
[2, 4, 5, 7],
[9, 2, 6, 3],
[0, 3, 1, 0] ]

從陣列豎直方向(即頂部,底部)看“天際線”是:[9, 4, 8, 7]
從水平水平方向(即左側,右側)看“天際線”是:[8, 7, 9, 3]

在不影響天際線的情況下對建築物進行增高後,新陣列如下:

gridNew = [ [8, 4, 8, 7],
[7, 4, 7, 7],
[9, 4, 8, 7],
[3, 3, 3, 3] ]
說明:

1 < grid.length = grid[0].length <= 50。
grid[i][j] 的高度範圍是: [0, 100]。
一座建築物佔據一個grid[i][j]:換言之,它們是 1 x 1 x grid[i][j] 的長方體。

先遍歷一下,把天際線找出來,然後為了不影響天際線,每個建築都不能超過他對應的橫縱天際線,換句話說,就是加上建築物高度和對應橫縱天際線的差值

class Solution:
    def maxIncreaseKeepingSkyline(self, grid: List[List[int]]) -> int:
        tran = [0 for i in range(len(grid[0]))]
        vert = [0 for i in range(len(grid))]
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] > tran[j]:
                    tran[j] = grid[i][j]
                if grid[i][j] > vert[i]:
                    vert[i] = grid[i][j]
        ans = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                ans += min(tran[j],vert[i]) - grid[i][j]
        return ans

9、1379. 找出克隆二叉樹中的相同節點

給你兩棵二叉樹,原始樹 original 和克隆樹 cloned,以及一個位於原始樹 original 中的目標節點 target。

其中,克隆樹 cloned 是原始樹 original 的一個 副本 。

請找出在樹 cloned 中,與 target 相同 的節點,並返回對該節點的引用(在 C/C++ 等有指標的語言中返回 節點指標,其他語言返回節點本身)。

注意:

你 不能 對兩棵二叉樹,以及 target 節點進行更改。
只能 返回對克隆樹 cloned 中已有的節點的引用。
進階:如果樹中允許出現值相同的節點,你將如何解答?

示例 1

輸入: tree = [7,4,3,null,null,6,19], target = 3
輸出: 3
示例 2:

輸入: tree = [7], target = 7
輸出: 7
示例 3:

輸入: tree = [8,null,6,null,5,null,4,null,3,null,2,null,1], target = 4
輸出: 4
示例 4:

輸入: tree = [1,2,3,4,5,6,7,8,9,10], target = 5
輸出: 5
示例 5:

輸入: tree = [1,2,null,3], target = 2
輸出: 2

提示:

樹中節點的數量範圍為 [1, 10^4] 。
同一棵樹中,沒有值相同的節點。
target 節點是樹 original 中的一個節點,並且不會是 null 。

這道題不清楚python的機制什麼情況,必須要判斷結點是否為空,否則找不到值,但基本的做法就是遍歷,怎麼遍歷應該都可以,因為沒有重複。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def getTargetCopy(self, original: TreeNode, cloned: TreeNode, target: TreeNode) -> TreeNode:
        def f(node):
            if not node:
                return None
            if node.val==target.val:
                self.res=node
            f(node.left) 
            f(node.right)
        f(cloned)
        return self.res

10、1281. 整數的各位積和之差

給你一個整數 n,請你幫忙計算並返回該整數「各位數字之積」與「各位數字之和」的差。

示例 1:

輸入:n = 234
輸出:15
解釋:
各位數之積 = 2 * 3 * 4 = 24
各位數之和 = 2 + 3 + 4 = 9
結果 = 24 - 9 = 15
示例 2:

輸入:n = 4421
輸出:21
解釋:
各位數之積 = 4 * 4 * 2 * 1 = 32
各位數之和 = 4 + 4 + 2 + 1 = 11
結果 = 32 - 11 = 21

提示:

1 <= n <= 10^5

把數字切割,每一位進行遍歷即可

class Solution:
    def subtractProductAndSum(self, n: int) -> int:
        pro = 1
        add = 0
        while n != 0:
            pro *= int(n % 10)
            add += int(n % 10)
            n /= 10
            n = int(n)
        return int(pro - add)

11、1389. 按既定順序建立目標陣列

給你兩個整數陣列 nums 和 index。你需要按照以下規則建立目標陣列:

目標陣列 target 最初為空。
按從左到右的順序依次讀取 nums[i] 和 index[i],在 target 陣列中的下標 index[i] 處插入值 nums[i] 。
重複上一步,直到在 nums 和 index 中都沒有要讀取的元素。
請你返回目標陣列。

題目保證數字插入位置總是存在。

示例 1:

輸入:nums = [0,1,2,3,4], index = [0,1,2,2,1]
輸出:[0,4,1,3,2]
解釋:
nums index target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
3 2 [0,1,3,2]
4 1 [0,4,1,3,2]
示例 2:

輸入:nums = [1,2,3,4,0], index = [0,1,2,3,0]
輸出:[0,1,2,3,4]
解釋:
nums index target
1 0 [1]
2 1 [1,2]
3 2 [1,2,3]
4 3 [1,2,3,4]
0 0 [0,1,2,3,4]
示例 3:

輸入:nums = [1], index = [0]
輸出:[1]

提示:

1 <= nums.length, index.length <= 100
nums.length == index.length
0 <= nums[i] <= 100
0 <= index[i] <= i

python寫這個題比較無腦,直接insert按要求填入引數即可

class Solution:
    def createTargetArray(self, nums: List[int], index: List[int]) -> List[int]:
        target = []
        for i in range(len(nums)):
            target.insert(index[i],nums[i])
        return target

12、1313. 解壓縮編碼列表

給你一個以行程長度編碼壓縮的整數列表 nums 。

考慮每對相鄰的兩個元素 [freq, val] = [nums[2i], nums[2i+1]] (其中 i >= 0 ),每一對都表示解壓後子列表中有 freq 個值為 val 的元素,你需要從左到右連線所有子列表以生成解壓後的列表。

請你返回解壓後的列表。

示例:

輸入:nums = [1,2,3,4]
輸出:[2,4,4,4]
解釋:第一對 [1,2] 代表著 2 的出現頻次為 1,所以生成陣列 [2]。
第二對 [3,4] 代表著 4 的出現頻次為 3,所以生成陣列 [4,4,4]。
最後將它們串聯到一起 [2] + [4,4,4] = [2,4,4,4]。
示例 2:

輸入:nums = [1,1,2,3]
輸出:[1,3,3]

提示:

2 <= nums.length <= 100
nums.length % 2 == 0
1 <= nums[i] <= 100

這道題直接遍歷然後按照要求把數字壓入ans陣列然後返回即可

class Solution:
    def decompressRLElist(self, nums: List[int]) -> List[int]:
        ans = []
        for i in range(0,len(nums),2):
            for j in range(nums[i]):
                ans.append(nums[i+1])
        return ans