[剑指Offer]把数组排成最小的数
2016-05-03 10:01
323 查看
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321}, 则打印出这三个数字能排成的最小数字为321323。
输入
int[] numbers:输入正整数数组
输出
组合之后最小的数
思路
这个题目类似于字典序的问题,而在这里,是比较两个数字组合之后的大小。即对于数字a和b,它们之间的组合有ab和ba两种,要求我们打印出最小的一个组合数字出来; 如果ab小于ba,则a是在b的前面; 如果ab大于ba,则b在a的前面;按照这种思路,对于一个输入数组中的所有数字,我们按照冒泡排序的思想,每一轮进行两两比较,找出一个放在前面的数字出来。代码如下:public static String PrintMinNumber(int [] numbers) { if(numbers == null){ return null; } StringBuilder sb = new StringBuilder(); String pre,last; int temp; for(int i = 0; i < numbers.length; i++){ for(int j = i + 1; j < numbers.length; j++){ pre = numbers[i] + "" + numbers[j]; //转换成字符串的形式 last = numbers[j] + "" + numbers[i]; if(pre.compareTo(last) > 0){ //比较组合之后的ab和ba temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; } } sb.append(numbers[i]); } return sb.toString(); }
上面代码中,我们为了避免组合两个数字之后,组合后的数字超出int类型所能表示的最大范围,将组合数字转换成了字符串的形式,通过String类的compareTo()函数进行比较两个字符的字典序。
其中String类的compareTo()函数的源码如下:
public int compareTo(String anotherString) { //比较两个字符串的字典序 int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
大家有没有发现,在compareTo方法中,传递过来的参数anotherString可以直接通过anotherString.value的方式(代码3行或6行处)获取到存储的字符串数组,而value在String中明明是被设置为private的,按道理是不能通过“对象名.变量名”的方式访问的,我们平常获取字符串的字符数组也是通过String的toCharArray()方法来获取的,而为什么在这里就行呢?在下一篇Java笔试面试题的总结中我将会谈到这个问题。
相关文章推荐
- 剑指offer 数组中只出现一次的数字
- Node.js其他模块
- JS基于clipBoard.js插件实现剪切、复制、粘贴
- 从无到有写一个jQuery开源插件
- BufferString
- React-Natvie 介绍大全
- webdriver 执行js
- React-Native之通信机制
- [置顶]Innodb Buffer Pool内部结构
- innodb redo buffer的认识
- Mysql Join_buffer_size的使用原理
- [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页
- 《高性能JavaScript》摘要
- 什么是JS事件冒泡
- (OK) dnf - Fedora23——删除多余不用的内核
- JS实现判断滚动条滚到页面底部并执行事件的方法
- JS自定义data-*属性与jquery的data()方法的使用
- jsp include中文乱码问题解决方案
- JavaScript arguments 对象
- Javascript验证和限制文本框只能输入数字或者小数