把数组排成最小的数(剑指offer第33题)
一、题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,
打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},
则打印出这三个数字能排成的最小数字为321323。
二、解题思路
1.最直接的办法就是先求出这个数组中所有数字的全排列,然后把每个排列拼接起来,最后求出拼接起来的数字的最小值。求数组的排列和字符串排列非常相近。根据排列组合知识,n个数字总共有n!个排列。
2.采用比较数组中字符串大小的方法。
根据题目要求,两个数字m和n能拼接成数字mn和数字nm,如果mn<nm那么说明m应该排在n前面,我们应该打印出mn;反之,如果nm<mn,我们定义n小于m.r如果mn=nm,则表示m和n大小相等。
Java中,compareTO函数能够按照字典顺序将两个字符串相比较,返回一个int型。因此,可以先将整数数组转化为字符串数组,然后再采用Collections.sort()函数排序比较后的字符串大小。
三、java代码(先看方法一,再看方法二就懂了)
public class Solution_33 {/*** 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,* 打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},* 则打印出这三个数字能排成的最小数字为321323。*///方法一,没有使用比较器,使用冒泡排序 24ms 9085kpublic String PrintMinNumber1(int [] numbers) {for(int i=0;i<numbers.length;i++){for(int j=numbers.length-1;j>i;j--){if(compare(numbers[j-1], numbers[j])>0){int temp = numbers[j-1];numbers[j-1] = numbers[j];numbers[j] = temp; }}}String s = "";for(int i=0;i<numbers.length;i++){s+=numbers[i];}return s;}public int compare(int int1,int int2){String str1 = int1+""+int2;String str2 = int2+""+int1;return str1.compareTo(str2);}//方法二、使用比较器public String PrintMinNumber(int [] numbers) {int n = numbers.length;String s = "";ArrayList<Integer> list = new ArrayList<Integer>();for(int i=0;i<n;i++){list.add(numbers[i]);}Collections.sort(list,new Comparator<Integer>() {public int compare(Integer str1,Integer str2){String s1 = str1+""+str2;String s2 = str2+""+str1;return s1.compareTo(s2);}});for(int j:list){s+=j;}return s;}//测试一下public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个数组,以“,”,隔开");String str = scanner.nextLine();String [] temp = str.split(",");scanner.close();int[] array = new int[temp.length];for(int i=0;i<array.length;i++){array[i] = Integer.parseInt(temp[i]);}Solution_33 solution_33 = new Solution_33();System.out.println(solution_33.PrintMinNumber(array));}
}
把数组排成最小的数(剑指offer第33题)相关推荐
- 旋转数组的最小元素——《剑指offer》
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转.请返回旋转 ...
- 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格
一.把数组排成最小的数: 1.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为 ...
- 【LeetCode】剑指 Offer 45. 把数组排成最小的数
[LeetCode]剑指 Offer 45. 把数组排成最小的数 文章目录 [LeetCode]剑指 Offer 45. 把数组排成最小的数 package offer;import java.uti ...
- 【剑指offer-Java版】33把数组排成最小的数
把数组排成最小的数 难点在于比较规则的确定以及比较规则的正确性证明 比如:仅仅是局部的两个数字的顺序较小,如何保证整个数组按此规则进行排序后达到全局的较小 书中关于这一点的证明直接用的反证法,忘的差不 ...
- 剑指 Offer 笔记: T45. 把数组排成最小的数
T45. 把数组排成最小的数 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" ...
- 面试题45. 把数组排成最小的数
题目: 面试题45. 把数组排成最小的数 题解: 1. 题解一: 2. 题解二: * 解题思路:* 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来.关 ...
- 33:把数组排成最小的数
/*** 面试题33:把数组排成最小的数* 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.* 例如输入数组{3,32,321},则打印出这三个数字能排成的 ...
- 算法:把数组排成最小的数
* @Description 把数组排成最小的数* @问题:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.* 例如输入数组{3,32,321},则打印出这 ...
- 数据结构与算法--将数组排成最小的数
将数组排成最小的数 题目:输入一个正整数的数组,将数组中所有数字拼接在一起排列成一个新的数,打印能拼接出来的所有数字中最小的一个, 案例:输入数组{12,4,55},则能打印出最小的数组是:12455 ...
- printf打印数组_(45)C++面试之把数组排成最小的数
// 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3 ...
最新文章
- Jboot v2.0-rc.12 发布,优化细节问题
- UVA 1613 K-Graph Oddity K度图着色 (构造)
- python3.5中pdfkit的详细配置与使用
- 此应用无法在你的电脑上运行_能直运行iOS应用!苹果新macOS翻车 正式版下载后无法安装...
- 利用bladex+avue实现一对多的关系
- 关联性挖掘--Apriori算法详解
- 王者权志龙回归!支持爱豆壁纸少不了
- thinkphp的model模型的设计经验总结
- Spring WebSocket入门(一) 转载
- Android VLC 加载ass字幕乱码问题
- Python3爬虫新手实践及代码、经验分享
- 前端程序员应该理解的reduce方法,对你的js能力很有帮助
- dockr pull 无法拉取镜像提示找不到注册表
- ISA8051内部结构讲解
- TCP的核心系列 — SACK和DSACK的实现(六)
- 华为轮值CEO郭平:与伙伴同行,打造智能社会五朵云之一
- 常用WebServices 天气,IP,邮编,Email,火车时刻表,股票 web接口服务
- ABBYY FineReader15下载安装激活及使用常见问题操作技巧
- 离散数学学习笔记----一阶逻辑等值演算与推理
- 安全设备——IDSIPS