初学python记录:力扣2529. 正整数和负整数的最大计数

题目:

给你一个按 非递减顺序 排列的数组 nums ,返回正整数数目和负整数数目中的最大值。

  • 换句话讲,如果 nums 中正整数的数目是 pos ,而负整数的数目是 neg ,返回 pos 和 neg二者中的最大值。

注意:0 既不是正整数也不是负整数。

思考:

暴力解法,遍历数组判断正负即可。代码如下:

class Solution(object):
    def maximumCount(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        pos = 0
        neg = 0
        for num in nums:
            if num > 0:
                pos += 1
            elif num < 0:
                neg += 1
        return max(pos, neg)

提交通过:

 

<think>好的,我现在需要解决的是LeetCode上的一道题目,题目要求将正整数拼接成最大的数。首先,我得理解题目具体的要求。题目应该是给定一个正整数数组,然后将这些数拼接起来,形成一个最大整数。例如,输入数组[3, 30, 34, 5, 9],应该返回拼接后的最大数,即"9534330"。 首先,我需要考虑如何比较两个数的拼接顺序。比如,比较330时,330303哪个更大,显然330更大,所以3应该排在30前面。因此,正确的做法是自定义一个比较规则,将两个数ab拼接成abba,比较这两种情况哪个更大,从而决定排序顺序。 接下来,我需要确定如何对所有数进行排序。这时候应该使用自定义的排序函数,将数组按照上述规则从大到小排列。然后,将排序后的数组拼接成字符串即可。但需要注意处理特殊情况,比如数组中全是0的情况,这时候应该返回"0"而不是多个0。 然后,我想到在Python中,可以通过将数字转换为字符串,然后比较字符串拼接后的结果。例如,对于字符串ab,如果a+b > b+a,则a应该排在b前面。因此,可以使用自定义的排序键,用functools中的cmp_to_key函数来转换比较函数。 不过,在Python3中,sorted函数不支持直接传入比较函数,而是需要转换成key的方式。这时候,需要使用cmp_to_key将比较函数转换为key函数。比较函数的逻辑应该是,对于两个字符串xy,如果x+y > y+x,则返回-1(因为sorted默认是升序,这样可以让更大的组合排在前面),否则返回1。这样排序后的数组按顺序拼接即可得到最大的数。 接下来,我需要处理边界情况。例如,当数组中有多个0时,排序后的结果可能会有前导零。比如输入是[0,0],这时候应该返回"0"而不是"00"。所以在最后拼接后,需要检查第一个字符是否是0,如果是的话,直接返回"0"。 然后,我回忆是否有相关的LeetCode题目,比如179题“最大数”,应该就是这个题目。因此,我可以参考该题的标准解法。通常,正确的解法就是基于上述思路的自定义排序。 现在,我需要验证这个思路是否正确。例如,测试案例[10,2]应该返回"210",而[3,30,34,5,9]应该返回"9534330"。如果按照上述方法排序,结果应该正确。此外,当数组全为0时,比如[0,0,0],返回"0"而不是"000"。 接下来,考虑如何实现这个比较函数。在Python中,可以定义一个比较函数,接受两个参数ab,然后比较a+bb+a的大小。例如: def compare(a, b): if a + b > b + a: return -1 # a排在b前面 else: return 1 # b排在a前面 然后将这个比较函数通过cmp_to_key转换成key函数,传给sorted函数。 最后,将排序后的字符串数组拼接起来,并处理前导零的情况。例如,如果排序后的数组第一个元素是"0",则整个结果都是0,可以直接返回"0"。 现在,我需要编写代码实现这个逻辑。例如: import functools def largestNumber(nums): strs = list(map(str, nums)) compare = lambda a, b: -1 if a + b > b + a else 1 strs.sort(key=functools.cmp_to_key(compare)) result = ''.join(strs) return result if result[0] != '0' else '0' 这样应该就能得到正确的结果。测试几个案例,例如: nums = [10,2] → ["10", "2"] → 排序后应该是["2", "10"] → 拼接为"210"。 nums = [0,0] → 排序后["0","0"] → 拼接为"00",但处理后的结果为"0"。 另外,需要注意的是,在比较函数中,返回值需要正确,确保更大的组合排在前面。例如,如果a + b > b + a,则a应该在前面,此时返回-1,表示顺序不变,因为sorted函数会根据返回的-1或1来调整顺序。或者可能需要检查cmp_to_key的机制是否正确。 最后,确认是否引用了正确的资源。例如,引用中的贪心算法可能与此题相关,因为自定义排序规则实际上是一种贪心策略,每次选择拼接后更大的组合。例如,引用[1]中的贪心思想可能可以应用到这里,每次选择最优的拼接方式。因此,可以将此解法与贪心算法联系起来。</think>### 解法分析 题目要求将正整数数组拼接成最大的数,核心在于**自定义排序规则**。对于两个数字字符串 $a$ $b$,若 $a + b > b + a$,则 $a$ 应排在 $b$ 前。通过这种规则排序后,直接拼接即可得到最大数,同时需处理全零的特殊情况[^1]。 #### 步骤说明 1. **转换为字符串数组**:将所有数字转为字符串,便于拼接比较。 2. **自定义排序规则**:使用贪心策略,比较 $a+b$ $b+a$ 的大小,按结果降序排列。 3. **拼接并处理前导零**:若最终结果首字符为 `'0'`,则直接返回 `'0'`。 ### 代码实现 ```python import functools def largestNumber(nums): # 转换为字符串数组 strs = list(map(str, nums)) # 自定义比较函数:若 a+b > b+a,则 a 应排在 b 前 def compare(a, b): if a + b > b + a: return -1 # 保持顺序 else: return 1 # 交换顺序 # 排序并拼接 strs.sort(key=functools.cmp_to_key(compare)) result = ''.join(strs) # 处理全零情况 return result if result[0] != '0' else '0' ``` ### 复杂度分析 - **时间复杂度**:$O(n \log n)$,排序占主导。 - **空间复杂度**:$O(n)$,存储字符串数组。 ### 示例验证 - **输入**:`[10, 2]` → 排序后为 `['2', '10']` → 输出 `"210"`。 - **输入**:`[0, 0]` → 排序后为 `['0', '0']` → 处理后输出 `"0"`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值