排列数组中数字得出最大数算法
来源:互联网 发布:华为盒子看电影软件 编辑:程序博客网 时间:2024/06/14 08:09
今日见一有意思的算法题目:“编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。”
最简单的是爆力破解,数组全排列,最后拼出来的数取最大的。然而没有啥技术含量,于是摒弃。
接下来分析,另外一种实现方法,
分析:为了要得到最大值,那么要从每个数的最高位比较,取最高的(比如第一个数字是9的)放在拼接数字最前面。最完9的,就看有没有8的,依次类推。这是第一步。
第二个问题是,如果有多个数字最高位都是9,怎么办呢?显然,比较它们的第二位,谁数字大谁在最前面。
这里又有一个特殊情况,比如最高位都是7的三个数(7,75,78),这时怎么处理呢?很显然,这三个数拼起来拼得最大值是78775。看见没,10以内的数字放的位置比较特殊。这是因为78,75后面的数字分别是8和5, 一个比7大,一个比7小。所以数字7就放在了78和75中间才会使拼起来的数最大。
实现代码如下:
import java.util.Arrays;import java.util.Comparator;/** * Problem Description: * 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。 * * This is a solution for this problem. * * @author Administrator * */public class FindMaxArray {static Comparator<Integer> c = new Comparator<Integer>(){@Overridepublic int compare(Integer o1, Integer o2) {// TODO Auto-generated method stubreturn myCompare(o1.toString(), o2.toString());//return 0;}int myCompare(String s1, String s2) {String shortOne, theOther;shortOne = s1;theOther = s2;if(s1.length() > s2.length()) {shortOne = s2;theOther = s1;}String tmp = theOther.substring(0, shortOne.length());if(tmp.equals(shortOne) && shortOne.length() > 1){return s1.compareTo(s2);}else{return 0 - s1.compareTo(s2);}}};public void magicSort(Integer a[]){Arrays.sort(a, c);int lastIndex = a.length-1;if (lastIndex < 0 ) return ;Integer t = a[lastIndex];if(t<10 && lastIndex>0){int i=0;for(;i<lastIndex;i++){int j=1;String tmp = a[i].toString();int strLength = tmp.length();while(j<strLength && tmp.charAt(j)-'0' >= t){j++;}if(j != strLength) break;}if(i!=lastIndex){for(int k = lastIndex; k>i; k--){a[k] = a[k-1];}a[i] = t;}}}public void findMaxNum(Integer[] nums){Integer[][] buckets = new Integer[10][];int[] assist = new int[10];String[] numStrs = new String[nums.length];int i=0;for(int n : nums) {numStrs[i] = String.valueOf(n);++i;}i=0;for(String numstr : numStrs){assist[numstr.charAt(0)-'0']++;}i=1;for(; i<10; i++){buckets[i] = new Integer[assist[i]];}i=0;for(String numstr: numStrs){// 将数字分桶装int index = numstr.charAt(0)-'0';Integer[] tmp = buckets[index];tmp[tmp.length-assist[index]] = nums[i];assist[index]--;i++;}i=1;for(; i<10; i++){magicSort(buckets[i]);// sort 每个桶中的数 in a special way}StringBuilder sb = new StringBuilder();for(i=9;i>0;i--){// 从大往小输出拼接for(Integer item : buckets[i]){sb.append(item);}}System.out.println(sb.toString());}public static void main(String[] args) {// TODO Auto-generated method stubInteger[] nums = {3,2,4,5,98,12,971,9,45,97,90};Integer[] nums2 = {50, 2, 1, 9};System.out.println(Arrays.toString(nums));FindMaxArray fma = new FindMaxArray();fma.findMaxNum(nums2);}}
说得比较简单,给能看懂的兄弟看吧!!!
#############################################python实现(好简单呀)#################################################
def get_max_num(given_list): max_len = len(str(max(given_list))) str_data = [(('{:'+str(item)[-1]+'<'+str(max_len)+'}').format(item), len(str(item))) for item in given_list] print('tuple data= ', str_data) sorted_str = sorted(str_data, reverse=True) print('sort_data= ', sorted_str) decode_str = [sd[0][:sd[1]] for sd in sorted_str] print('result= ', ''.join(decode_str))get_max_num([9,99,77,123,8,78,76,7])
在此谢谢熟悉Python的凯恒(p.s. 你提供给我的代码有一点点错误,我偷偷没有告诉你。。。)
阅读全文
0 0
- 排列数组中数字得出最大数算法
- C++数组排成最大的数(数组,算法,排列)
- 算法-数组:螺旋数字排列
- 分析得出10个数中最大的数
- 数组中求最大数
- 两个数和三个数比较得出最大数
- 排列求最大数
- python排列最大数
- Java从键盘中读取一串数字存入数组,并返回元素组成的最大数
- 设计一个在一百万个数字中求十个最大的数算法
- 算法学习---求数组中的最大数
- 数组排序算法之,组成最大数
- js算法总结(冒泡算法,在数组中找最大的三个数)
- java实现无序整数数组组合得出最大数,如array={1,2,3},array2={123,132,213,231,312,321}。最大数是321
- 一个能将给定非负整数数组中的数字排列成最大数字的函数
- 一个能将给定非负整数数组中的数字排列成最大数字的函数
- Java给定一个数组,数组元素是一些正整数,求这些正整数收尾详解得出的最大数或最小数
- 算法 数字排列问题
- Nginx--官网中文翻译(中英文对比)--13-nginx如何处理会话How nginx processes a TCPUDP session
- 8.02训练总结
- ZOJ-3714
- java 面试题整理一
- 嵌入式多功能电子相册之上位机
- 排列数组中数字得出最大数算法
- Android O 行为变更(二)
- 订阅Linux内核邮件列表
- HDU-2017 多校训练赛3-1004-Kanade's trio
- PipedOutputStream和PipedInputStream管道实现线程通信
- python爬虫上手 笔记<3>
- java8初探
- QAV250四轴穿越机安装全程详解(多图)
- 洛谷Oj-单词接龙-深度优先搜索