Lintcode数组

1、删除元素

#坑:1、由于要求在原来数组上删除所以是不能创建一个新的列表记录不等于目标的数值。
#        2、是不能正向删除的,使用反向删除
    def removeElement(A, elem):
        # write your code here
        j = len(A) - 1
        while j >= 0:
            if A[j] == elem:
                A.pop(j)
            j -= 1
        return len(A)

2.子数组之和

#思路:最容易想到的是,遍历所有子串返回和为0的。这种解法复杂度为O(n2)不理想
#进阶解法:用一个字典记录,到当前位置前面所有子串的和,当出现两个和一样,或者有某个为0的时候,就可以知道之间就存在和为0的子串。
def subarraySum(self, nums):
        # write your code here
        if nums == [0]:return [0,0] #坑!
        d = {nums[0]: 0}
        pre_sum = nums[0]
        for i in range(1, len(nums)):
            now_sum = pre_sum + nums[i]
            pre_sum = now_sum
            if now_sum == 0:
                return [0, i]
            elif now_sum in d:
                return [d[now_sum]+1, i]
            else:
                d[now_sum] = i

3.删除排序数组中的重复数字

思路:倒着删除,当后一项和前一项相等时,删除后一项即可。
class Solution:
    """
    @param: nums: An ineger array
    @return: An integer
    """
    def removeDuplicates(self, nums):
        # write your code here
        if len(nums) == 1:return len(nums)
        for i in range(len(nums) - 1, -1, -1):
            if nums[i] == nums[i - 1]:
                nums.pop(i)
        return len(nums)
其实在做这道题的时候,刚开始眼瞎了,没看到有序!然后就当乱序的来做,下面是乱序的解法(上面算是这里的一种特殊情况)
def fun(nums):
    from collections import Counter
    c = Counter(nums)
    for i in range(len(nums) - 1, -1, -1):
        if c[nums[i]] > 1:
            c[nums[i]] -= 1
            nums.pop(i)
    return len(nums)

猜你喜欢

转载自www.cnblogs.com/linshuhui/p/9863186.html
今日推荐