5.把数组排成最小的数
问题描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出来的所有数字中最小的一个。
例如:
输入数组 {3,32,321},
则打印出这 3 个数字能排成的最小数字 321323。
思路:
- 将整形数组转换成 String 数组 (为了解决大数问题: m 和 n 都在 int 能表达的范围内,但拼起来的数字 mn 和 nm 用 int 表示就有可能溢出了);
- 将 String 数组排序;
- 将排好序的字符数组拼接起来。
关键是,制定排序规则。规则如下:
- 若 mn > nm ,则 m > n;
- 若 mn < nm ,则 m < n;
- 若 mn = nm ,则 m = n 。
- 比如:“3” < “31”,但 “331” > “313”,所以要拼接起来进行比较。
代码:
|
|
6.数组中的逆序对
问题描述:
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数。
思路:
- 把数组分割成子数组;
- 统计出子数组内部的逆序对的数目;
- 统计出两个相邻子数组之间的逆序对的数目;
- 在统计逆序对的过程中,还需要对数组进行排序。这个排序的过程其实就是归并排序。
归并排序的合并过程。主要是考虑合并两个有序序列时,计算逆序对数。
规则:
- 对于两个升序序列,设置两个下标:两个有序序列的末尾。
- 每次比较两个末尾值,如果前末尾大于后末尾值,则有 “后序列当前长度” 的逆序对,否则不构成逆序对;
- 然后把较大值拷贝到辅助数组的末尾,即最终要将两个有序序列合并到辅助数组并有序。
代码:
|
|