最近看到两道编程题,有点意思,不过网上看了一下,虽然有一些人写出了算法,但是感觉算法思想表述的都不够清晰,特别是都是直接上结论,然后证明这么做是对的。
我不大喜欢这种表述方式,尝试着以更容易理解的"顺向思维",没错,不是什么"逆向思维",就是正常的思路来推导一下求解过程.
①把数组排成最小的数
输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
http://blog.csdn.net/wuzhekai1985/article/details/6704902已经给出了算法过程,并且证明了算法是对的,这算法就是定义a与b的大小关系,若ab<ba,则a<b.然后按照这种定义的顺序把最小的排在最前边就行了.
那么,我们是如何想到这种算法的呢?
首先随便写出一个方案,我们考察这个方案是否能够优化,如果能应该怎么做?
比如给定一个方案bca,我们考虑这个数字能否通过优化变得更小呢?
考虑最简单易行的优化方式----相邻元素交换,如果bca的前两位交换顺序变为cba之后整个数字变小了,那么应该满足什么条件呢