持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 给定数字的范围是 [0, 10^8]
二、思路分析:
我们今天拿到本题是 leetcode 难度为中等题 670.最大交换。根据题目要求对一个非负整数,只能至多交换一次任意两位,并返回最大值。对于本题我们需要注意两点:
- 题目给出的是:非负的整型
- 交换后两位后,数字是最大的
- 因此在进行交换前,我们需要将num转换成列表list类型
根据本题,解答本题我们可以使用暴力法和贪心法两种,思路如下:
-
方法一:暴力法
- 需要交换num里面的两个数字,直接使用两个for循环
- 依次两两交换比较,取最大的那个数
class Solution(object): def maximumSwap(self, num): strnum = list(str(num)) n = len(strnum) ans = num for i in range(n): for j in range(i+1,n): strnum[i],strnum[j] = strnum[j],strnum[i] ans = max(ans,int("".join(strnum))) strnum[i],strnum[j] = strnum[j],strnum[i] return ans -
方法二:贪心法
- 本题核心需要找到两个数字,即左边数字索引index1和右边数字索引index2位置进行交换,保证右边越大的数字与左边较小的数字进行交换,这样就能保证交换后,得到的数字是最大的
- 首先我们需要定义三个变量:index1,index2和maxide,都位于strnum末尾🔚
- 初始化定义最大数索引为maxide
- 从后往前对strnum进行遍历,当strnum[i] > strnum[maxide]时,则maxide更新为i
- 当strnum[i] < strnum[maxide]时,则更新左边和右边数索引位置index1 = i,index2 = maxide
- 当idex1小于0时,则不需要进行交换,直接返回num
- strnum[index1],strnum[index2] 两个数字进行交换即可,join(strnum)转换成字符串,返回int类型
class Solution(object): def maximumSwap(self, num): """ :type num: int :rtype: int """ strnum = list(str(num)) n = len(strnum) maxide = -1 idex1,idex2 = -1,-1 for i in range(n-1,-1,-1): if strnum[i] > strnum[maxide]: maxide = i elif strnum[i] < strnum[maxide]: idex1,idex2 = i,maxide if idex1 < 0: return num strnum[idex1],strnum[idex2] = strnum[idex2],strnum[idex1] return int("".join(strnum))
三、总结:
本题考察对贪心算法运用,进行两次贪心,1贪找到左边最小数索引,2贪找到右边最大数索引,然后进行交换即可得到最大数,AC提交记录如下:
- 时间复杂度:O(lognum),num是给定的数字
- 空间复杂度:O(lognum),num是给定的数字
以上是本期内容,欢迎大佬们点赞评论,下期见~~~