算法练习三

算法练习三

最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例1:

输入:nums = [10,2]
输出:"210"

示例2:

输入:nums = [3,30,34,5,9]
输出:"9534330"

解题思路:
我们第一步需要明白一个事情,就是’102‘>’90‘意味整数类型一样成立,那么我们可以将列表数字转换为字符格式,方便我们进行拼接。使用list.sort()而里面有的参数cmp,如果cmp=1表示两两比较返回为正便交换两者位置。了解之后就不难写出一个判断x+y和y+x的函数并与sort()进行排序。这个题目还有需要注意的地方,就是可能会出现’00’这种情况,则需要特殊处理一下。

代码:

class Solution(object):
    def largestNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: str
        """
        nums_Str = map(str,nums)
        compare = lambda x,y : -1 if x+y>y+x else 1
        nums_Str.sort(cmp=compare)
        res = ''.join(nums_Str)
        if res[0] == '0':
            res = '0'
        return res

摆动排序II

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。

你可以假设所有输入数组都可以得到满足题目要求的结果。

示例1:

输入:nums = [1,5,1,1,6,4]
输出:[1,6,1,5,1,4]
解释:[1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受。

示例2:

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

解题思路:
满足 nums[0] < nums[1] > nums[2] < nums[3]顺序,可以使用交叉插入去实现。可以使用for循环进行相隔插入,即逆序交叉插入。

代码:

class Solution(object):
    def wiggleSort(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        N,n = len(nums),len(nums) - 1
        snums = sorted(nums)
        for i in range(1,N,2): #逆序穿插
            nums[i] = snums[n]
            n -= 1
        
        for i in range(0,N,2): #逆序穿插
            nums[i] = snums[n]
            n -= 1
            
        return None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值