题目:输入一个正整数数组。把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个。比如输入数组{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. element-UI中table表格的@row-click事件和@selection-change耦合了

    <el-table ref="multipleTable" :data="tableData" tooltip-effect="dark&quo ...

  2. oc7--内存分析

    // // main.m // 第二个OC类 #import <Foundation/Foundation.h> @interface Person : NSObject { @publi ...

  3. 分享3个Putty配色方案【转】

    本文转载自:https://www.coder4.com/archives/1506 分享3个Putty配色方案 4 Replies 虽然服务器都是Linux的,平时也基本用Linux,但是难免还是要 ...

  4. day63-webservice 04.JaxWsServerFactoryBean和SOAP1.2

    <wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap12="h ...

  5. C# 数组动态添加新元素的 方法

    经常在开发中  会对字符串 进行split 拆分操作.. 得到数组后再去做相应的事情! 但有时候,需求决定了 数组的长度 不是固定的, 而C# 数组 是不允许动态添加新的元素的.. 这事情让我也纠结了 ...

  6. 9.13[XJOI] NOIP训练32

    今日9.13 洛谷打卡:小吉(今天心情不错,决定取消密码) (日常记流水账) 上午 今天听说是鏼鏼的题目,题面非常的清真啊,也没有当初以为的爆零啊 T1 排排坐 非常非常清真的模拟或是结论题,再次将难 ...

  7. 获取远程请求的IP地址、本机Mac地址和客户端Mac地址

    我在近期项目里面去记录异常日志时,用到了这两个地址,也是从网上和前辈那里学习到的,本人项目是MVC框架的,自己整理了一个公共方法类,包括获取远程客户端IP和Mac地址,以及获取本机Mac地址的方法,代 ...

  8. CI中的文件上传

    //首先在控制器中装载url类和view视图: //在view视图中创建一个表单,注:在做文件上传一定要写encype=“multipart/form-data”: //form表单的提交页面应该使用 ...

  9. [hihocoder][Offer收割]编程练习赛46

    AEIOU 选出的子串中由AEI构成的子串和由OU构成的子串之间并没有什么关系,分别算出最长的加起来. #pragma comment(linker, "/STACK:102400000,1 ...

  10. python3爬虫:下载网易云音乐排行榜

    #!/usr/bin/python3# -*- encoding:utf-8 -*- # 网易云音乐批量下载 import requestsimport urllib # 榜单歌曲批量下载# r = ...