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

  • 相关阅读:
    项目可行性方案:人脸识别实现无感考勤的项目技术可行性方案
    前端项目练习(练习-001-纯原生)
    单商户商城系统功能拆解20—售后订单
    Linux服务器配置与管理(基于Centos7.2)任务目标(六)
    [Unity] GPU动画实现(三)——材质合并
    中国智能家居市场发展研究
    多线程与高并发——并发编程(7)
    爬虫 | 正则、Xpath、BeautifulSoup示例学习
    2023年优化算法之之霸王龙优化算法(TROA),原理公式详解,附matlab代码
    Raft 算法、分布式 KV 面试汇总
  • 原文地址:https://blog.csdn.net/MLittlehands/article/details/126839383