Leetcode day04

本文探讨了数组中移动零元素的问题,通过删除并补充零实现原地操作。此外,介绍了排序数组的方法,包括冒泡排序、选择排序和归并排序,并强调了对于大规模数组,应避免使用效率较低的排序算法。最后,展示了如何将数组元素组合成最小数字的策略,通过比较数字组合的大小来调整顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

283. 移动零

难度简单1307

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

解题思路:删除数组的0,补充相同个数的0到列表末尾。

代码:

class Solution:

    def moveZeroes(self, nums: List[int]) -> None:

        """

        Do not return anything, modify nums in-place instead.

        """

        for i in range(nums.count(0)):

            nums.remove(0)

            nums.append(0)

912. 排序数组

难度中等423

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  1. 1 <= nums.length <= 50000
  2. -50000 <= nums[i] <= 50000

解题思路:数组排序,这道题是用于熟悉各种排序算法的。然而数组太大,使用原始的冒泡、选择、插入排序算法都会超时...

代码:

# 冒泡排序

def sortBuble(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for i in range(n - 1):
            not_changed = True
            for j in range(n - i - 1):
                if nums[j] > nums[j + 1]:
                    nums[j], nums[j + 1] = nums[j + 1], nums[j]
                    not_changed = False
            if not_changed:
                break
        return nums

# 选择排序
    def sortSelect(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for i in range(n - 1):
            min_index = i
            for j in range(i + 1, n):
                if nums[j] < nums[min_index]:
                    min_index = j
            nums[i], nums[min_index] = nums[min_index], nums[i]
        return nums

# 归并排序
    def sortMerge(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for i in range(1, n):
            tmp = nums[i]
            j = i
            while j > 0 and nums[j - 1] > tmp:
                nums[j] = nums[j - 1]
                j -= 1
            nums[j] = tmp
        return nums

剑指 Offer 45. 把数组排成最小的数

难度中等324

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

解题思路:比较两数字组合成的新数字大小,如果原本组合的数字更大就交换两数的顺序,最后输出字符串形式的结果。

代码:

class Solution:

    def minNumber(self, nums: List[int]) -> str:

        n = len(nums)

        for i in range(n):

            for j in range(i,n-1):

                len1 = len(str(nums[j]))

                len2 = len(str(nums[j+1]))

                if (nums[j]*(10**len2)+nums[j+1])>(nums[j+1]*(10**len1)+nums[j]):

                    nums[j], nums[j+1] = nums[j+1], nums[j]

                print(nums[j],nums[j+1])

        res = ""

        for i in range(n):

            res+=str(nums[i])

        return res

### LeetCode 积分获取方式 在 LeetCode 平台上,用户可以通过多种途径来增加自己的积分。完成每日题目能够使用户的分数有所增长[^1]。例如,在提到的一个实例中,“今日得分:+10 总得分:240”,这表明通过解决特定问题可以获得额外的积分奖励。 除了日常挑战外,参与周赛也是提升积分的有效手段之一。每周的比赛不仅考验参赛者的编程技巧,还提供了赢得更高排名的机会,从而带来更多的积分收益。不过需要注意的是,并未直接提及周赛的具体加分机制。 对于那些希望快速提高自己积分的人来说,专注于解答高难度的问题可能是一个不错的选择。通常来说,越难的任务完成后所给予的经验值也会相应增多。然而具体每道题目的确切分值并未在此处给出说明。 另外值得注意的是,持续活跃于社区讨论区也可能间接帮助个人积累更多积分。虽然这种活动本身并不直接贡献于积分系统,但是积极参与可以促进技能成长并发现更高效的解法路径,进而有助于更好地应对各类竞赛和练习中的难题。 ```sql -- 这里提供了一个SQL查询的例子用于计算玩家留存率,而非直接关联到积分制度, -- 但展示了如何利用数据库操作分析平台上的行为数据。 SELECT ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction FROM Activity WHERE (player_id, DATE_SUB(event_date, INTERVAL 1 DAY)) IN ( SELECT player_id, MIN(event_date) FROM Activity GROUP BY player_id); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值