最近在刷剑指Offer上的题时遇到一题:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

突然想到使用LSD算法,

 1 package com.roysatm.niuke;
 2
 3
 4 /**
 5  * Created by roysatm on 2016/5/30.
 6  */
 7 public class SolutionPrintMinNumber {
 8
 9     /**
10      * 采用LSD(低位优先排序)思想,可以说能把高位优先排序取代。
11      * 基本是O(n)时间复杂度完成,没有使用任何java集合框架
12      * 代码可能不是最优,特别是空间复杂度方面
13      */
14     public String PrintMinNumber(int[] numbers) {
15
16         if (numbers == null || numbers.length == 0) {
17             return "";
18         }
19
20         String[] str = new String[numbers.length];
21         int w = 0;
22         //将int数组转成string数组
23         for (int i = 0; i < numbers.length; i++) {
24             str[i] = numbers[i] + "";
25         }
26         //计算出str数组中长度最长的字符串长度
27         for (int i = 0; i < str.length; i++) {
28             if (str[i].length() > w) {
29                 w = str[i].length();
30             }
31         }
32
33         StringBuilder sb = new StringBuilder();
34
35         String[] array = PrintMinNumber(str, w);
36         //将String数组转换成String字符串
37         for (int i = 0; i < array.length; i++) {
38             sb.append(array[i]);
39         }
40         return sb.toString();
41     }
42
43     public String[] PrintMinNumber(String[] str, int w) {
44
45         /**
46          * 低位优先排序,主要看点是getCharAt(String s, int index)函数的变化
47          由于getCharAt(String s, int index)函数的改变,LSD可以排长度不同的字符串
48          * **/
49
50         int R = 256;
51         int N = str.length;
52         String[] aux = new String[N];
53
54         for (int i = w - 1; i >= 0; i--) {
55
56             int[] count = new int[R + 1];
57
58             for (int j = 0; j < N; j++) {
59                 count[getCharAt(str[j], i) + 1]++;
60             }
61
62             for (int j = 0; j < R; j++) {
63                 count[j + 1] += count[j];
64             }
65
66             for (int j = 0; j < N; j++) {
67                 aux[count[getCharAt(str[j], i)]++] = str[j];
68             }
69
70             for (int j = 0; j < N; j++) {
71                 str[j] = aux[j];
72             }
73         }
74
75         return str;
76     }
77
78     private char getCharAt(String s, int index) {
79
80         if (s.length() <= index) {
81             return s.charAt(s.length() - 1);
82         } else {
83             return s.charAt(index);
84         }
85     }
86
87     public static void main(String[] args) {
88         int[] a = {12, 2, 34, 13, 54};
89         SolutionPrintMinNumber spm = new SolutionPrintMinNumber();
90         String str = spm.PrintMinNumber(a);
91         System.out.print(str + " ");
92
93     }
94 }

以上算法是LSD排序算法升级版,不仅能排序字符串长度相同的数组,还能像高位优先一样排序字符串不同的数组。

下次有时间再详细写写.......

转载于:https://www.cnblogs.com/Roysatm/p/5615075.html

字符串低位优先排序真的只能排序字符串相同的字符么?相关推荐

  1. 字符串低位优先排序(LSD)和高位优先排序(MSD)原理及C++实现

    前言: 最近正好在学习字符串相关的算法,写了下LSD.MSD以及三向快速排序算法,写完了过后有很大的感触,所以决定把这几天所学习的东西记录下来. 原理: 键索引计数法:         在开始介绍LS ...

  2. 算法-低位优先的字符串排序

    低位优先的字符串排序相当于是对键索引计数方法的一个扩展,主要用于处理固定长度字符串,比如说手机号,固定电话,银行卡卡号,字符串的长度为N,从右向左开始进行每个键作为值开始遍历,实现比较简单: -(vo ...

  3. 字符串排序算法:低位优先排序(LSD)

    LSD:低位优先的字符串排序,核心思想就是对字符串的每个字符做一次键索引排序 #include <iostream> #include <utility> #include & ...

  4. 空字符串计数、让字典可排序...Python冷知识(五)

    本文转载自Python编程时光(ID: Python-Time) 冷知识系列,直至今日,已经更新至第五篇.前四篇给你准备好了,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) ...

  5. R语言使用str_order函数和str_sort函数对字符向量进行排序(str_order返回字符串排序的次序值(索引)、str_sort返回排序后的字符串)

    R语言使用str_order函数和str_sort函数对字符向量进行排序(str_order返回字符串排序的次序值(索引).str_sort返回排序后的字符串) 目录

  6. php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序

    C++ 如何实现字典序排序法,自然排序 类似PHP的natcasesort函数,整了一天没有头绪. 数组是vector 排序前: [0] => IMG0.png [1] => IMG3.p ...

  7. 计数排序的应用----排序字符串

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 题目: 给你一个原始字符串,根据该字符串内每一个字符串出现的次数,按照ASCII码递增的排序重新调整输出. 举例: ...

  8. java字符串数组排序_在Java中对字符串数组进行排序

    允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为ArrayL ...

  9. C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果。

    /*C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果.*/#include <stdio.h> #include <conio.h& ...

  10. 对字符串按“红黄蓝”进行排序,如“蓝黄红红黄”,输出结果为“红红黄黄蓝”

    对字符串按"红黄蓝"进行排序,如"蓝黄红红黄",输出结果为"红红黄黄蓝" public static void main(String[] ...

最新文章

  1. 32位汇编寄存器及汇编指令
  2. Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
  3. 岗位内推 | 微软亚洲互联网工程院自然语言处理组招聘NLP工程师
  4. Kylin安装,Kylin网页版教程学习
  5. 计算机模拟人工录入,用计算机模拟交互式输入代替人工进行流程录入
  6. Owner Useful links
  7. 搭建内网yum服务器
  8. windows 虚拟磁盘的软链接_如何在Windows的操作系统下创建VHD虚拟磁盘
  9. 错误解决:release' is unavailable: not available in automatic reference counting mode
  10. android访问asset目录下的资源
  11. linux发邮件权限,Linux通过命令行发邮件的步骤
  12. scala-Unit-3-Scala基础语法2
  13. Ubuntu - 安装gcc
  14. android后台获取当前屏幕截图(screencap.cpp修改)
  15. 深入理解AQS之ReentrantReadWriteLock详解
  16. Deepin Linux系统安装及显示器配置教程(可竖屏)
  17. php 中文转义问题
  18. 69 Three.js 导入Collada(.dae)格式的模型
  19. 上海租房房源数据分析(基于R的案例分析)(一)
  20. 2021年中式烹调师(中级)考试内容及中式烹调师(中级)新版试题

热门文章

  1. kubernetes RC(Replication Controller)和RS(Replicaset)的作用和区别
  2. jpeg 转rgb c 语言_威刚推出SE770G移动固态硬盘 主打高速传输和RGB灯效
  3. mysql+mmm+主动模式_MySQL集群搭建(4)-MMM+LVS+Keepalived
  4. linux程序设计大作业,LINUX/UNIX Shell编程大作业
  5. mysql报1665_mysql错误处理之ERROR 1665 (HY000)_MySQL
  6. springboot的学习笔记,这个很重要
  7. php 方法注释代码规范,PHP开发代码规范
  8. 【mysql】扩展-常用函数
  9. Linux chapter 2
  10. 悲剧!IDEA 突然找不到类了?