【Lintcode】1095. 最大的交换

描述
给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。

思路
1.读取数值,将数值转换成字符串
2.从后至前寻找最大数字。先设置一个的指针point指向最后一位,for循环中如果前面的数值比指针指向的大就将指针指向最大的数字的下标。
3.如果最大数值不是数值的第一位数字,就调换最大值与第一位数字的位置,返回新的数值;如果最大数值是第一位,则截取除最高位数字剩下的数字组成新的数值反复进行1-3步。

    class Solution:
            """
            @param num: a non-negative intege
            @return: the maximum valued number
            """
            def maximumSwap(self, num):
                # Write your code here
                snum = str(num)
            	numLength = len(snum)
            	if numLength == 1:  #递归的边界
            		return num
            	point = numLength - 1 
            	maxNum = snum[numLength - 1]

				# 找出最大的数的位置
            	for i in range(numLength - 2,-1,-1):
            		if snum[i] > maxNum:
            			maxNum = snum[i]
            			point = i

				# 如果最大的数不在第一位,则与第一位交换
            	if point != 0:
            		snum = list(snum)
            		temp = snum[0]
            		snum[0] = snum[point]
            		snum[point] = temp
            		snum = ''.join(snum)
            		return int(snum)
            		
				# 如果最大的数字在第一位,则递归除了第一位的数值
            	elif point == 0:
            		num = int(str(num)[0]) * (10 **(numLength-1)) + Solution().maximumSwap(num%(10 ** (numLength-1)))
            		return num

在这里插入图片描述
LintCode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值