时间复杂度:O(n log²n)
解题思路
对数组按照首位大小从大到小排序,对于首位相同长度不同的元素,分别计算二者两种结合情况的大小,谁在前的结果更大谁就在前面。
AC代码
func largestNumber(nums []int) string {
sort.Slice(nums,func (i,j int)bool{
x,y:=nums[i],nums[j]
sx,sy:=10,10
for sx<=x{
sx*=10
}
for sy<=y{
sy*=10
}
return x*sy+y>y*sx+x
})
if nums[0]==0{
return "0"
}
res:=[]byte{}
for i:=0;i<len(nums);i++{
res=append(res,strconv.Itoa(nums[i])...)
}
return string(res)
}
感悟
为了自定义排序,用到了sort包下的slice方法,自定义了比较函数。最后为了返回字符串,创建了一个byte切片,然后将字符串的字符逐个加入到切片中,最后将切片转为string。