其实这道题的本质是一个排序问题.不管求最大还是最小, 我们都可以使用排序算法解决. 普通排序是升序还是降序,主要看交互比较代码,这里求最小值相当于一个升级, 求最大值相当于一个降序.

这道题的特殊就在于求数组所有数字组成在一起最小值.如12和9, 直接观察就能看出129比912要小, 所以我们排序可以抽象为m与n两个数据,相当于mn与nm相比.再结合使用快速排序或冒泡排序都可以啦. 关键在于这个比较函数的操作.

golang 语言实现

核心: 比较函数代码

//核心函数

// 如 9, 12. 我们需要做912与129的比较, 显然912>129

//如果ab < ba 的话则返回true,否则返回false

func cmp(a, b int) bool {

if a == b {

return false

}

sa := strconv.Itoa(a)

sb := strconv.Itoa(b)

sa2 := sa + sb

sb2 := sb + sa

ma, err := strconv.Atoi(sa2)

if err != nil {

log.Fatal("a params transfer failed")

return false

}

nb, err := strconv.Atoi(sb2)

if err != nil {

log.Fatal("b params transfer failed")

return false

}

fmt.Printf("m:%d,n:%d\n", ma,nb)

if ma > nb { //相当于mn > nm 将最小的元素置换到最前面.如果是小于则最大元素置换到最前面.

return true

}

return false

}

介绍三种方法实现.

1.sort.Slice

时间复杂度:O(Nlogn)

//利用系统自带排序函数

func MinNumberBySort(numbers []int) string {

if len(numbers) == 0 {

return ""

}

sort.Slice(numbers, func(i, j int) bool {

return !cmp(numbers[i], numbers[j])

})

build := strings.Builder{}

for _, v := range numbers {

build.WriteString(strconv.Itoa(v))

}

return build.String()

}

2. 冒泡方法

时间复杂度O(n^2)

//冒泡方法, 时间复杂度O(n^2)

func PrintMinNumberByBubbling(numbers []int) string {

length := len(numbers)

for i := 0; i < length; i ++ {

for j := 0; j < length-1-i; j++ {

if cmp(numbers[j], numbers[j+1]) {

numbers[j], numbers[j+1] = numbers[j+1], numbers[j]

}

}

}

build := strings.Builder{}

for _, v := range numbers {

build.WriteString(strconv.Itoa(v))

}

return build.String()

}

3.快速排序

//快排实现

func MinNumbersByQuickSort(numbers []int) string {

qSort(numbers, 0, len(numbers)-1)

build := strings.Builder{}

for _, v := range numbers {

build.WriteString(strconv.Itoa(v))

}

return build.String()

}

//快排

func qSort(arr []int, left, right int) {

i, j := left, right

pivot := arr[left]

for left < right {

for left < right && cmp(arr[right], pivot) {//比较大小, 大于中间值的不移动,反之移动.

right --

}

arr[left] = arr[right]

for left < right && cmp(pivot, arr[left]) {//比较大小, 小于中间值的不移动.反之移动

left ++

}

arr[right] = arr[left]

}

arr[left] = pivot

if left - i > 1 {

qSort(arr, i, left-1)

}

if j - left > 1 {

qSort(arr, left+1, j)

}

}

测试用例

func TestPrintMinNumber(t *testing.T) {

src.Asset(1, t, "10211516279", PrintMinNumberByBubbling([]int {16,27,15,9,102, 1}))

src.Asset(2, t, "1516279", PrintMinNumberByBubbling([]int{16,15,27,9}))

}

func TestMinNumber(t *testing.T) {

src.Asset(1, t, "10211516279", MinNumberBySort([]int {16,27,15,9,102, 1}))

src.Asset(2, t, "1516279", MinNumberBySort([]int{16,15,27,9}))

}

func TestMinNumbersByQuickSort(t *testing.T) {

src.Asset(1, t, "10211516279", MinNumbersByQuickSort([]int {16,27,15,9,102, 1}))

src.Asset(2, t, "1516279", MinNumbersByQuickSort([]int{16,15,27,9}))

}

golang 数组组合成最小的整数_整数数组拼成一个最小或最大的数相关推荐

  1. golang 数组组合成最小的整数_golang数组-----寻找数组中缺失的整数方法

    问题:由n-1个整数组成的未排序数组,元素都是1~n的不同整数,找出其中缺失的整数 方法一: 思路:是原数组的和 减去 丢失元素后的数组的和,就得到丢失的元素了 代码如下: package main ...

  2. golang 数组组合成最小的整数_Redis之整数集合底层实现

    1.整数集合简述 整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现.例如当我们创建只包含五个元素的集合键,并且集 ...

  3. 两个数组合成一个json对象_两个jsonarray合并

    技术文档 主体内容:可以认为是页面最想表达的内容总和.对于内容详情页来说,主体内容指从标题开始至正文内容结束,翻页区域也被视为主体内容,文章后的评论.分享.推荐等不视为主体内容. 首屏:用户点击搜索结 ...

  4. 最小采样频率计算公式_离散系统、Z变换和最小拍控制的理解与总结

    离散系统.Z变换和最小拍控制的理解与总结 先注:离散系统用差分方程来表达,频域变换为Z变换 连续系统用微分方程来表达,频域变换为s变换 从采样信号说起: 如图所示: 在数学即为:采样信号(脉冲采样)的 ...

  5. 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j...

    //整数数组的定义,然后输入一个整数x,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j: //如果X在该阵列,返回位置的阵列中的数. 资源: #include<iostr ...

  6. golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理

    1 01 引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发). 1.1 进程和 ...

  7. 7-88 组合成最小的三位数

    7-88 组合成最小的三位数 输入一个三位数的正整数,将数字位置重新排列,组成一个尽可小的三位数. 输入格式: 输入一个三位的正整数. 输出格式: 输出组合之后最小的三位值正整数. 输入样例: 315 ...

  8. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组

    满意答案 vi31892i 2013.09.11 采纳率:44%    等级:11 已帮助:6956人 这好象是汇编语言的问题吧 举个例子吧 #include "iostream.h&quo ...

  9. python画父子关系图_将有父子关系的一维数组转换成树形结构(多维)数据

    先来个函数注释 : /** * 将有父子关系的一维数组转换成树形结构(多维)数据 * console.log(JSON.stringify(setTreeData(data), null, 2)); ...

最新文章

  1. 谈谈离散卷积和卷积神经网络
  2. ic卡复制软件_使用MCT复制IC卡0扇区的方法(适用于NFC手机复制或模拟门禁卡)...
  3. kademlia java_分布式哈希表原理与实现(Python版和Java版)
  4. 前端学习(1925)vue之电商管理系统电商系统之通过一层for循环渲染
  5. 颜宁:批评一下当年的「颜宁同学」
  6. java dvr_java实现海康NVR/DVR设备工作状态获取
  7. 引入jQuery的src设置
  8. python `__hash__`
  9. asp代码在dwearwear转换成html格式怎么转,为前端而生的编辑器Brackets及配置推荐
  10. matlab 字符查找函数,matlab字符函数
  11. 二、17【FPGA】无源蜂鸣器驱动实验
  12. KubeCon上海“行业客户云原生最佳实践日“成功举办,云原生在各行业落地生花...
  13. 应届毕业生怎么找java工作,应届毕业生怎么能找到高薪工作?
  14. python mysql插入数据报错:TypeError: %d format: a number is required, not str
  15. 忆龙2009:梦幻魔方V1.2.1.1正式发布
  16. 车载激光扫描系统介绍
  17. Cheat Engine安装 汉化
  18. 关于fi dd ler 手机抓包 网卡地址地址_超详细的网络抓包神器 tcpdump 使用指南
  19. linux环境MySQL8.0安装
  20. 巴菲特抄底台积电,透露出哪些信号?

热门文章

  1. 机械硬盘(HDD)与固态硬盘(SSD)
  2. 数字时代:DevOps工程师的必备技能清单
  3. 服务器怎么买,腾讯云服务器购买三种流程介绍
  4. pandas中merge函数的用法
  5. win10下注册MSCOMM32控件
  6. python 使用 io.BytesIO 内存文件加速图片生成服务
  7. 千亿美妆市场“野蛮生长”,悦瞳靠“假睫毛”能否“翘”动市场?
  8. C语言在一个数组中查找一个数字
  9. DCM4CHEE-ARC-LIGHT
  10. 最新Android 黄油刀(Butterknife)的简单使用