(Leetcode)要素除去-Python実装

2831 ワード

テーマ:要素の除去
配列numsと値valを指定すると、valに等しいすべての数値の要素をその場で除去し、除去後の配列の新しい長さを返す必要があります.余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.要素の順序は変更できます.配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.
Given an array nums and a value val, remove all instances of that value in-place and return the new length.Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.The order of elements can be changed. It doesn't matter what you leave beyond the new length.
例:nums=[3,2,2,3]、val=3が与えられ、関数は新しい長さ2を返し、numsの最初の2つの要素は2である.配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.
説明:なぜ返される数値は整数ですが、出力される答えは配列ですか.入力配列は「参照」で渡されます.これは、関数で入力配列を変更することが呼び出し元に表示されることを意味します.
---------------------------------------------------------------------------
考え方:この問題が間違いやすいのは、listをforループで直接削除すると、下付きindexが衝突することです.ループで要素を削除するため、listの長さは常に変化します.
解法1:従来のforループの代わりにwhileループ+pythonのinメソッド+remove()関数を用いる.
class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """

        while val in nums:
            nums.remove(val)
        return len(nums)
解法2:numsを1回遍歴し、すべての等値valの小さなスケールを記録します.さらにmarksを巡回することで、要素を1つずつ削除します.
remove()関数は、リスト内の値の最初の一致を除去するために使用されます.
class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """

        marks = []
        for num in nums:
            if num == val:
                marks.append(num)

        for mark in marks:
            nums.remove(mark)
        return len(nums)
解法3:whileループ+pythonが持参したpop()メソッドにより直接削除を実現する.
class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """

        l = len(nums)
        if l == 0:
            return 0
        i = 0
        while i < l:
            if nums[i] == val:
                nums.pop(i)
                l -= 1
            else:
                i += 1
        return len(nums)
解法4:pythonが持参したcount()とremove()関数により実現する.
class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        coun = nums.count(val)
        for index in range(coun):
            nums.remove(val)
参考:
https://www.runoob.com/python/att-list-remove.html
https://www.runoob.com/python/att-list-pop.html
https://blog.csdn.net/qiubingcsdn/article/details/82144173
https://blog.csdn.net/qq_34364995/article/details/80274162