(Datawhale组队学习)Leetcode面试篇-Task1-day3

题目1 只出现一次的数字 Leetcode136

  描述:给定一个非空整数数组 numsnums 中除了某个元素只出现一次以外,其余每个元素均出现两次。

  要求:找出那个只出现了一次的元素。

  说明

  • 要求不能使用额外的存储空间。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 这题可以用位运算
        # 0异或任何数都是这个数本身
        # 任何数与本身异或,结果都是0
        # 所以这题就只需要用一个0来异或所有数,就可以找到这个列表中唯一的数了
        num = 0
        for x in nums:
            num = num^x
        return num

 题目2  合并区间 Leetcode56

  描述:给定数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。

  要求:合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

 思路:先把intervals,即原列表中的各个区间按照升序排列,再模拟一个栈,先放一个区间进去,然后逐次放入新的区间,如果新的区间可以与这个区间合并,则合并,不可合并,则top指针加1,将该区间压入栈顶,最终返回这个栈列表

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals[:] = sorted(intervals, key = lambda x:x[0]) # 确保区间都是升序排列
        s = [intervals[0]]
        top = 0
        for i in range(1,len(intervals)):
            if s[top][1] >= intervals[i][0] and s[top][1] <= intervals[i][1]:
                s[top][1] = intervals[i][1]
            elif s[top][1] < intervals[i][0]:
                top = top + 1
                s.append(intervals[i])

        return s
                

题目3 最大数 Leetcode179

  描述:给定一个非负整数数组 nums

  要求:重新排列数组中每个数的顺序,使之将数组中所有数字按顺序拼接起来所组成的整数最大。

import functools

def my_compare(x, y):
    if str(x)+str(y) > str(y)+str(x): # 如果顺序结合的数更大,则不用交换,返回-1 
        return -1
    elif str(x)+str(y) <= str(y)+str(x): # 如果顺序结合的数更小,则需要交换,返回1 
        return 1
    else:
        return 0

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        # 这也是一种贪心排序问题
        # 如果想要最终的数字是个最大的数
        # 那么这个数组中,每个数和左边的数结合的新数一定比和右边结合的新数更大
        nums[:] = sorted(nums,key=functools.cmp_to_key(my_compare))
        if nums[0]==0:
            return "0"
        s = ''
        for x in nums:
            s = s + str(x)
        return s

额外加练 字符串的左右移 Leetcode1427

        描述:

  给定一个包含小写英文字母的字符串 s 以及一个矩阵 shift,其中 shift[i] = [direction, amount]

  • direction 可以为 0 (表示左移)或 1 (表示右移)。
  • amount 表示 s 左右移的位数。
  • 左移 1 位表示移除 s 的第一个字符,并将该字符插入到 s 的结尾。
  • 类似地,右移 1 位表示移除 s 的最后一个字符,并将该字符插入到 s 的开头。

  对这个字符串进行所有操作后,返回最终结果

思路:循环位移时,左移右移之间往往可以相互转换,我这里是将左移视为负数,右移视为正数,全部加起来之后,再对字符串整体长度取模。这样就会把所有的操作化为一个右移操作。

class Solution:
    def stringShift(self, s: str, shift: List[List[int]]) -> str:
        move = 0
        for x in shift:
            if x[0]==0:
                move = move-x[1]
            else:
                move = move+x[1]
        move = move % len(s) # 统统转化成右移
        l = ''
        for i in range(move):
            l = l + s[-move + i ] # 先把会被移到前面的字符串加到头上
        for i in range(0,len(s)-move): # 再把剩下的字符串给加上
            l = l + s[i]
        return l

        

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值