数组07--把数组排成最小的数-jz32

题目概述

  • 算法说明
    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
  • 测试用例
    输入:
    [3,32,321]
    输出:
    “321323”

解析&参考答案

  • 解析
    1 将数组转为字符串数组,并对其进行排序
    2 对相同首字母的相邻字符串进行排序,确保ab<ba
    3 输出排完序的字符串数组即可
  • 参考答案
vim jz32.go
package main

import (
"fmt"
"sort"
"strconv"
)

func PrintMinNumber(numbers []int) string {
var strList []string
for _, v := range numbers {
strList = append(strList, strconv.Itoa(v))
}
sort.Strings(strList)
for i := 0; i < len(strList)-1; i++ {
for j := i + 1; j < len(strList); j++ {
if strList[j][0] == strList[i][0] {
if (strList[i] + strList[j]) > (strList[j] + strList[i]) {
tmpStr := strList[j]
strList[j] = strList[i]
strList[i] = tmpStr
}
} else {
continue
}
}
}
result := ""
for _, v := range strList {
result = result + v
}
return result
}

func main() {
array := []int{4, 3, 32, 321}
result := PrintMinNumber(array)
fmt.Println(result)
}

vim jz32_test.go
package main

import "testing"

func TestPrintMinNumber(t *testing.T) {
tests := []struct {
array []int
result string
}{
{[]int{3, 32, 321}, "321323"},
{[]int{4, 3, 32, 321}, "3213234"},
}
for _, tt := range tests {
if actual := PrintMinNumber(tt.array); actual != tt.result {
t.Errorf("array %v got %s, expected to be %s", tt.array, PrintMinNumber(tt.array), tt.result)
}
}
}

注意事项

  1. to add

说明

  1. 当前使用 go1.15.8
  2. 参考​​牛客网--剑指offer​​ 标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。

注意!!!

  • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
  • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
  • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解