题目:输入一个正整数数组。把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个。比如输入数组{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. ProjectRuler 算法练习之 位数组成字符串同样的整数

    Problem :It can be seen that the number, 125874, and its double, 251748, contain exactly the same di ...

  2. Linux - 理不清的权限chmod与chown区别

    chmod是修改第一列内容的 ,chown是修改第3,4列内容的. [root@local ~]# chmod 777 -R add.sh [root@local ~]# chown jiqing:j ...

  3. php错误抑制符

    php错误抑制符 简介 PHP 支持一个错误控制运算符:@.当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉. @这个符号在Java里面是注解符号. 实例 <?ph ...

  4. Spring MVC简介 2.5 Spring MVC执行的流程

    package org.fkit.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http ...

  5. js作业

    1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米var sum=0;i=0;a=0.0001;for(i=0;i<100;i++){ a=a*2; sum=sum ...

  6. img和div的宽度不一样问题和li之间空隙问题的解决方案

    img和div宽度不一致问题 今天写代码,遇到一个小问题,我把一张图片放进一个div里,然后没有设置任何的padding和margin,但是发现图片和div的高度不一样,在img的下方出现了3px的空 ...

  7. 仿QQ浏览器mac版官网主页 html+css3特效

    这是一款超酷的CSS3动态背景动画特效,CSS3仿QQ浏览器官网彗星动画背景特效. 在线演示本地下载

  8. 解决strip: Unable to recognise the format of the input file问题

    前言   在编译xilinx的uboot的时候出现了一个问题,始终报错:“strip: Unable to recognise the format of the input file `gen_et ...

  9. load 调用的顺序

    主要是依赖关系. 调用的顺序 你过去可能会听说过,对于 load 方法的调用顺序有两条规则: 父类先于子类调用 类先于分类调用 这种现象是非常符合我们的直觉的,我们来分析一下这种现象出现的原因. 第一 ...

  10. public static final 的用法

    public satic final 修饰后变量的名字全部用大写,定以后可以用类名直接访问,定义的变量不能被修改 所有的接口成员已经是静态,由于接口没有方法所有所以必须先赋值才行,可以直接用接口名调用 ...