• 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. }

  • 相关阅读:
    【MySQL架构篇】逻辑架构
    python-异常try-except
    聊聊 MQTT 和 WebSocket
    使用Selenium进行元素定位的全面指南
    bean的生命周期(最全最细讲解)
    input输入框小写字母自动转换成大写字母的几种方式
    Cookie和Session的工作流程以及Servlet中与之相关的API
    ssm健康饮食推荐系统分析与设计毕业设计源码261631
    【爬虫】7.1. JavaScript动态渲染界面爬取-Selenium
    制作canal-adapter的docker镜像
  • 原文地址:https://blog.csdn.net/MLittlehands/article/details/126839383