题目:输入一个正整数数组。把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个。比如输入数组{3,32。321}。则打印出这3个数字能排成的最小数字321323.

这个题目最直接的做法应该是先求出这个数组中的全部数字的全排列,然后把每一个排列拼接起来,最后求出排列起来的数字的最小值。

求数组的排列和面试题28很相似。依据排列组合的仅仅是,n个数字总共同拥有n!排列,我们再来看一下更快的算法。

这道题事实上希望我们可以找到一个排序规则,数组依据这个规则排序之后能排成一个最小的数字。要确定排序的规则,就要比較两个数字,也就是给出两个数字m和n。我们须要确定一个规则推断m和n哪个应该排在前面,而不是只比較这两个数字的值哪个更大。

依据题目的要求,两个数字m和n能拼接称数字mn和nm。假设mn<nm,那么我们应该打印出mn,也就是m应该拍在N的前面,我们定义此时m小于n;反之,假设nm<mn,我们定义n小于m。假设mn=nm,m等于n。

接下来考虑怎么去拼接数字。即给出数字m和n,怎么得到数字mn和nm并比較他们的大小。

直接用数值去计算不难办到,但须要考虑一个潜在的问题就是m和n都在int能表达的范围内。把他们拼起来的数字mn和nm用int表示就有可能溢出了,所以这还是一个隐形的大数问题。

一个很直观的解决大数问题的办法就是把数字转换成字符串。

另外,因为把数字m和n拼接起来得到mn和nm,他们的位数肯定是同样的,因此比較它们的大小仅仅须要依照字符串的大小的比較规则就能够了。

基于这个思路。我们实现代码:

/**
* 把数组排成最小的数
* 输入一个正整数数组,把数组里全部的数字拼接起来排成一个数。
* 打印能拼接出来的全部数字中最小的一个
*/
package swordForOffer; /**
* @author JInShuangQi
*
* 2015年8月9日
*/
public class E33SortArrayForMinNumber { public void printMin(int[] arr){
int[] clone = arr.clone();
printMinNumber(clone,0,clone.length-1);
for(int i : clone)
System.out.print(i);
}
//核心+快排
public void printMinNumber(int[] arr,int left,int right){
if(left < right){
int main_number = arr[right];
int small_cur = left;
for(int j = left;j<right;j++){
if(isSmall(String.valueOf(arr[j]),String.valueOf(main_number))){
int temp = arr[j];
arr[j] = arr[small_cur];
arr[small_cur] = temp;
small_cur++;
}
}
arr[right]= arr[small_cur];
arr[small_cur] = main_number;
printMinNumber(arr,0,small_cur-1);
printMinNumber(arr,small_cur+1,right);
}
}
public boolean isSmall(String m,String n){
String left = m+n;
String right = n+m;
boolean result = false;
for(int i = 0;i<left.length();i++){
if(left.charAt(i)<right.charAt(i))
return true;
else
if(left.charAt(i)>right.charAt(i))
return false;
}
return result;
}
public static void main(String[] args){
int arr[] = {3,32,321};
E33SortArrayForMinNumber test = new E33SortArrayForMinNumber();
test.printMin(arr);
}
}

剑指Offer面试题33(java版):把数组排成最小的数的更多相关文章

  1. 《剑指offer》— JavaScript(32)把数组排成最小的数

    把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为3213 ...

  2. 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面

    题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...

  3. 剑指offer——面试题4:二维数组中的查找

    // 面试题4:二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数 ...

  4. 《剑指offer》第十一题(旋转数组的最小数字)

    // 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...

  5. 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)

    问题描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路1: ...

  6. 剑指Offer第36题—Java版

    本题使用归并排序的思想,结合归并排序,写出的算法解. //数组中的逆序对 public static int InversePairs(int[] array){ if(array==null||ar ...

  7. 剑指Offer编程题(Java实现)——数组中的重复数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  8. 剑指Offer面试题:2.二维数组中的查找

    一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  9. 剑指offer 面试题4:二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

随机推荐

  1. ijkplayer详解AAA

    https://www.jianshu.com/p/c5d972ab0309 https://www.android-arsenal.com/details/1/530 https://stackov ...

  2. Spring Boot:Exception parsing document: template="index", line 7 - column 3

    转自:https://blog.csdn.net/u010429286/article/details/75447561

  3. php 0,null,empty,空,false,字符串关系(转)

    在php中由于是弱类型语言,不同类型值之间可以隐式转换,使得false,null,”,0,’0′这几个值的比较有些混乱,现总结一下: //相等判断 '' == NULL == 0 == false ( ...

  4. ffmpeg实现

    最近做一个小项目,要在线播放录制的 MP4 视频,想开源的 flash player 或 html 5 可以播放.可,虽然 MP4 是 H.264 编码,但就是播放不了.可能是封装方式(PS 方式)不 ...

  5. 异步lambda表达式

  6. 1.Ventuz 介绍

    Ventoz能做什么? Ventuz是一款实时图文包装内容创作.制作和播出控制软件.Ventuz专注于高端视听内容的制作,包括交互展示和大型活动.视频墙.广播电视在线包装及演播室舞台及灯光控制等领域. ...

  7. 无序列表属性 隐藏方式 JS简介

    今天考试了,整理一下错题. 1.无序列表的属性 list-style 分为三小类 (1)list-style-type none:无标记. disc:实心圆(默认). circle:空心圆. squa ...

  8. damn selenium

    Selenium+Python [ˈpaɪθən] 0.Selenium安装 pip install selenium 1.打开了浏览器,后边什么都不干了 需要将浏览器驱动放置在环境变量的目录下. 2 ...

  9. 【MFC】如何在mfc窗口程序中调用控制台

    1.工程名为Zero,在CZeroDlg.cpp中加入头文件 #include “conio.h” : 2.在CZeroDlg::OnInitDialog() {…}函数中加入AllocConsole ...

  10. 【Oracle】ORA-55610: Invalid DDL statement on history-tracked table

    —删除表emp1时出现问题 SCOTT@GOOD> drop table emp1; drop table emp1 * ERROR at line 1: ORA-55610: Invalid ...