数组07--把数组排成最小的数
原创
©著作权归作者所有:来自51CTO博客作者昕光xg的原创作品,请联系作者获取转载授权,否则将追究法律责任
数组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)
}
}
}
注意事项
- to add
说明
- 当前使用 go1.15.8
- 参考牛客网--剑指offer 标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
注意!!!
- 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
- 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
- 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解