• go面试题 最大交换


     题目:给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。给定数字的范围是 [0, 108]

    1. 输入:
    2. 2736
    3. 1993
    4. 98368
    5. 2736
    6. 9973
    7. 115
    8. 输出:
    9. 7236 //交换数字2和数字7
    10. 9913
    11. 98863
    12. 7236
    13. 9973
    14. 511

    题解:拿到该题后,我们可以快速想到的是比较数值中每一个数值的大小来解决来进行排序,排列出最大的一组。因此,我们可以把int类型转变为数组类型来进行操作。(提示:面试中,我们没有太多的时间来考虑算法的复杂度问问,我们需要快速的把题目完成出来。)

    1.题目中给出了一个约束条件:至多可以交换一次数字中的任意两位。因此,我们可以快速想到从头开始判断该数值是否是后续中最大的。如果不是,我就记录该值为必须交换的,对比的值记录为可能交换的。如果是,我们就判断下一个值(如1993中,1要小于9,此时,我们可以记录下1是必须交换的和9是有可能交换的)。

    2.接下来,我们要从可能交换的值后面选择到大于等于的数值。如果,有大于或等于,我们把该值认为是可能交换的数值。

    3.我们将必须交换的值和可能要交换的值进行互换,得出最优解。

    1. func maximumSwap(num int) int {
    2. ans := make([]int,0)
    3. sum, tmp := 0 , num
    4. start, end := -1, -1
    5. fase := false
    6. max := 0
    7. for tmp != 0 {
    8. ans = append(ans,tmp%10)
    9. tmp /= 10
    10. sum++
    11. }
    12. for i := sum-1 ; i > 0 ; i-- {
    13. for j := i-1 ; j >= 0 ; j-- {
    14. if ans[i] < ans[j] {
    15. start = i
    16. end = j
    17. fase = true
    18. break
    19. }
    20. }
    21. if fase {
    22. break
    23. }
    24. }
    25. for i := end ; i >= 0 ; i-- {
    26. if ans[end] <= ans[i] {
    27. end = i
    28. }
    29. }
    30. if start != -1 {
    31. ans[start] , ans[end] = ans[end], ans[start]
    32. }
    33. for i := sum-1 ; i >= 0 ; i-- {
    34. max = max *10 +ans[i]
    35. }
    36. return max
    37. }

    进阶:为了由于该题难度不大,有可能会面临对时间复杂度进行要求的情况,因此我们对数据进行了优化。我们可以采用贪心算法对题目进行解题

    1. func maximumSwap(num int) int {
    2. arr := []byte(strconv.Itoa(num))
    3. n := len(arr )
    4. maxIdx, i1, i2 := n-1, -1, -1
    5. for i := n - 1; i >= 0; i-- {
    6. if arr[i] > arr[maxIdx] {
    7. maxIdx = i
    8. } else if arr[i] < arr[maxIdx] {
    9. i1, i2 = i, maxIdx
    10. }
    11. }
    12. if i1 < 0 {
    13. return num
    14. }
    15. arr[i1], arr[i2] = arr[i2], arr[i1]
    16. v, _ := strconv.Atoi(string(arr))
    17. return v
    18. }

  • 相关阅读:
    python中的图像增强技术
    ASUS (k013) ME176CX不进入系统恢复出厂设置的方法
    第七章 贝叶斯分类器(上)
    docker镜像常用命令
    C++动态规划算法简析
    最新完成的一个全栈微信小程序商城,包含后台和小程序端,服务器端
    408. Valid Word Abbreviation
    53. 最大子序和 392.判断子序列 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇
    markdown的基本语法
    降水预报之双重惩罚
  • 原文地址:https://blog.csdn.net/MLittlehands/article/details/126839383