剑指Offer面试题33(java版):把数组排成最小的数
题目:输入一个正整数数组。把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个。比如输入数组{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版):把数组排成最小的数的更多相关文章
- 《剑指offer》— JavaScript(32)把数组排成最小的数
把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为3213 ...
- 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- 剑指offer——面试题4:二维数组中的查找
// 面试题4:二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数 ...
- 《剑指offer》第十一题(旋转数组的最小数字)
// 面试题:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组 // {3, ...
- 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
问题描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路1: ...
- 剑指Offer第36题—Java版
本题使用归并排序的思想,结合归并排序,写出的算法解. //数组中的逆序对 public static int InversePairs(int[] array){ if(array==null||ar ...
- 剑指Offer编程题(Java实现)——数组中的重复数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指Offer面试题:2.二维数组中的查找
一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 剑指offer 面试题4:二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
随机推荐
- jstl 标签 循环 序号
大家好: 今天搜了一天.最终找到它了,尽管不是我想要的,可是为了我辛苦的一天.我也要记录下: <c:forEach items="${signBusList}" var ...
- 0x5C 数位统计DP
怎么说,数位DP还是我的噩梦啊,细节太恐怖了. 但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少) poj3208 f[i] ...
- 45.Qt openGL实现三维绘图
main.cpp #include <QApplication> #include <iostream> #include "tetraheadron.h" ...
- Mac osx下成功安装tensorflow
安装tensorflow有多种方式:Pip, Docker, Virtualenv, Anaconda 或 源码编译的方法安装. 我是在pip下成功安装tensorflow,以下只介绍在pip下安装( ...
- 查看 myeclipse激活状态
查看激活状态 myeclipse-->subscription information
- Aspose.Words将Word模板打印出来
利用Aspose.Words将制作好的模板,输出出来自己所需的文件 /// <summary> /// 打印信息和列表 /// </summary> /// <param ...
- Git Learning Part II - Working locally
file status life circle basic: modified: Examples: untracked: unmodified: modified: Git branching ...
- udacity_javascript设计模式
javascript设计模式 的学习记录 在优达学城上找到的 <javascript设计模式> 他主要是带动我们的思考 在 <第二章 分离重构> 中使用了 model octo ...
- MBR分区表格式 - 简明概述
目前硬盘主要有MBR和GPT分区两种格式,前者是Windows XP之前时代主流的分区格式,后者则是现在Windows 8之后主流的分区格式.(Windows 7需要通过一些手段能实现支持GPT,而W ...
- WinAPI使用: 时间,线程,中断
(1):C/C++获取当前系统时间:http://www.cnblogs.com/mfryf/archive/2012/02/13/2349360.html 不过当计算算法耗时的时候,不要忘记seco ...