剑指offer-面试题33-把数组排成最小的数
来源:互联网 发布:mac window 编辑:程序博客网 时间:2024/05/17 02:37
package case33_SortArrayForMinNumber;import java.util.Comparator;/** * 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 * 例如输入数字{3,32,321},则打印出这3个数字能拍成的最小数字321323。 * * @author WangSai * */public class SortArrayForMinNumber {/** * @param args */public static void main(String[] args) {int[] arr = { 3, 32, 321, 8, 1 };System.out.println(mySort(arr));}/* * 思路:举例,先拼接两个,例如3和32能拼接成的最小的数字为323。即(3,32) 要 大于 (32,3)。把两个数字拼接之后若ab<ba, * 则把a放在b的前边, 类似于数组中的排序。自定义排序规则之后,可以利用快速排序算法实现。 * 自定义排序规则:从数组中取出两个数字a和b,把数字a和数字b转换成字符串之后进行拼接,然后,利用字符串自身的compareTo()方法,比较两个 * 串的大小关系。 * * 这里同时解决了大数问题。比如a=Integer.MAX_VALUE,b=Integer.MAX_VALUE,ab拼接之后,会出现大数问题。 * 转换成字符串之后,巧妙 的避免了大数问题。 */private static String mySort(int[] arr) {// TODO Auto-generated method stub// 异常值检查if (arr == null || arr.length <= 0)return null;// 快速排序,自定义比较规则myComparator myCmp = new myComparator();mySortCore(arr, 0, arr.length - 1, myCmp);// 排序之后,把arr转换成字符串输出StringBuffer sb = new StringBuffer();for (int i = 0; i < arr.length; i++) {sb.append(arr[i]);}// return arr.toString();return sb.toString();}// 快速排序算法private static void mySortCore(int[] arr, int low, int high, Comparator<Integer> comp) {if (low < high) {int pivotPos = partition(arr, low, high, comp);mySortCore(arr, low, pivotPos - 1, comp);mySortCore(arr, pivotPos + 1, high, comp);}}// 分治算法private static int partition(int[] arr, int low, int high, Comparator<Integer> comp) {int pivotKey = arr[low];while (low < high) {while (low < high && comp.compare(pivotKey, arr[high]) <= 0)high--;arr[low] = arr[high];while (low < high && comp.compare(pivotKey, arr[low]) >= 0)low++;arr[high] = arr[low];}arr[low] = pivotKey;return low;}// 自定义比较器,实现Comparator接口private static class myComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {// 把数字拼接成字符串,同时解决了大数问题String str1 = o1 + "" + o2;String str2 = o2 + "" + o1;// 根据字符串自己的compateTo方法比较str1-str2的大小return str1.compareTo(str2);}}}
0 0
- 【剑指offer】面试题33:把数组排成最小数
- 剑指Offer面试题33把数组排成最小的数,面试题34丑数
- [剑指offer][面试题33]把数组排成最小的数
- 面试题33:把数组排成最小的数--《剑指offer》
- 剑指Offer:面试题33 把数组排成最小的数
- 剑指offer 面试题33—把数组排成最小的数
- 《剑指Offer》学习笔记--面试题33:把数组排成最小的数
- 《剑指Offer》面试题33:把数组排成最小的数
- 【剑指Offer学习】【面试题33:把数组排成最小的数】
- 剑指Offer面试题33(java版):把数组排成最小的数
- 【剑指offer】5.2时间效率——面试题33:把数组排成最小的数
- 剑指offer-面试题33:把数组排成最小的数
- 剑指offer面试题33:把数组排成最小的数
- 剑指Offer----面试题33:把数组排成最小的数
- 剑指Offer面试题33:把数组排成最小的数 Java 实现,三种方法
- 剑指offer面试题33:把数组排成最小的数
- 剑指offer--面试题33:把数组排成最小的数
- 剑指offer——面试题33:把数组排成最小的数
- Java 源码 ——顺序存取文件的创建及写入(Writing data to a sequential text file with class Formatter)
- java异常:org.springframework.beans.ConversionNotSupportedException
- HTTP请求
- 预处理
- 【qscoj】哗啦啦村的刁难(2)
- 剑指offer-面试题33-把数组排成最小的数
- CentOS7虚拟机无法联网,无法ping通网关
- 算法课第10周第3题——91. Decode Ways
- 记录配置Hadoop+zookeeper+Hbase的完整过程(三)
- 从零开始学递归与分治
- 域名系统DNS
- 第 1 章 数据与数据类型
- linux0.11内核 任务0 特权级 用户态 的疑问
- linux0.11 汇编 切换到任务0 的相关描述