将数组重新排序以构造最小值

题目描述

给定一个整数数组,请将其重新排序,以构造最小值。

样例

给定[3,32,321],通过将数组重新排序,可构造6个可能性的数字:

3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323

其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]。

挑战

在原数组上完成,不使用额外空间。

分析:

问题的关键在于如何比较两个数字的大小,将小的数字放在高位,将大的数字放在低位,构造的新数字就应当最小的。但此处比较数字大小不是一般的方式那种比较。比如比较321和3,首先321的从左数第一位是3,与单个数字3相等,那么接下来该怎么比较呢?如果把3放在高位,把321放在低位,那么组成的数字是3321,比把321放在高为构成的数字3213大,显然这里应该判断321比3小,怎么个小法?既然321第一位跟三相等,那么接着比较下一位,发现单个数字3已经到了最后一位,那么把321剩下的数字21和3来进行比较,发现2比3小,所以321小于3。按照这个思路,调用Collections.sort()函数,构造一个新的比较器,在比较器中实现上述比较方法。按位比较,显然需要将数字转换为字符串,这样比较容易提取各个位的数字。

Java算法实现

public class Solution {
/**
* @param nums n non-negative integer array
* @return a string
*/
public String minNumber(int[] nums) {
// Write your code here
List<String>list=new ArrayList<>();
for(int i=0;i<nums.length;i++){
//将所有数字转化为字符串
list.add(String.valueOf(nums[i]));
} Collections.sort(list,new Comparator<String>() {
//新的比较器,实现新方式的大小比较
@Override
public int compare(String str1, String str2) {
// TODO Auto-generated method stub
int i=0;
for(i=0;i<str1.length()&&i<str2.length();i++){
if(str1.charAt(i)<str2.charAt(i)){
//如果当前位已经比较出了大小,直接返回比较结果
return -1;
}
else if(str1.charAt(i)>str2.charAt(i)){
return 1;
}
}
if(i==str1.length()&&i==str2.length()){
//已经比较到了两个字符串的结尾
return 0;
}
else{
if(i<str2.length()){
//还没有比较到str2的结尾,用str2剩下的字符与str1进行比较
return compare(str1, str2.substring(i));
}
else{
//同上理
return compare(str1.substring(i), str2);
}
}
}
}); //构造结果字符串
StringBuilder sb=new StringBuilder();
for(String str:list){
sb.append(str);
}
String res=sb.toString();
int i=0;
/* 如果输入为[0],输出需要为"0";如果输入为[0,0,0,0,0],输出也应该为"0";
如果输入为[0,0,0,1,2,3],输出应为"123"。
下面的循环对此进行处理;
i<res.length()-1 的控制目的就是为了应对输入为[0]的情况,此时不需要增长i
*/
while(res.charAt(i)=='0'&&i<res.length()-1){
i++;
}
return res.substring(i);
}
}

标记为Easy,难度确实不大。但是一般很难考虑周全,最后剔除前首 '0' 的步骤,如果不是提交失败收到提醒,则很难有人直接就考虑明白。

LintCode2016年8月22日算法比赛----将数组重新排序以构造最小值的更多相关文章

  1. LintCode2016年8月22日算法比赛----骰子求和

    骰子求和 题目描述 扔n个骰子,向上面的数字之和为 S .给定 Given n,请列出所有可能的 S 值及其相应的概率. 样例 给定n=1,返回 [ [1, 0.17], [2, 0.17], [3, ...

  2. LintCode2016年8月22日算法比赛----克隆二叉树

    克隆二叉树 题目描述 深度复制一个二叉树. 给定一个二叉树,返回一个它的克隆品. 样例 给定一个二叉树: 1 / \ 2 3 / \ 4 5 返回其相同结构相同数值的克隆二叉树: 1 / \ 2 3 ...

  3. LintCode2016年8月22日算法比赛----平面列表

    平面列表 题目描述 给定一个列表,该列表中的每个要素要么是个列表,要么是整数.将其变成一个只包含整数的简单列表. 注意事项 如果给定的列表中的要素本身也是一个列表,那么它也可以包含列表. 样例 给定 ...

  4. LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树

    中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...

  5. LintCode2016年8月8日算法比赛----子树

    子树 题目描述 有两个不同大小的二叉树:T1有上百万的节点:T2有好几百的节点.请设计一种算法,判定T2是否为T1的子树. 注意事项 若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 ...

  6. LintCode2016年8月8日算法比赛----等价二叉树

    等价二叉树 题目描述 检查两棵二叉树是否等价.等价意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数据相等. 样例 1 1 / \ / \ 2 2 and 2 2 / / 4 ...

  7. 12月22日《奥威Power-BI财务报表数据填报》腾讯课堂开课啦

    一扇可以通向任何地方的“任意门”,是我们多少人幼时最梦寐以求的道具之一.即使到了现在,工作中的我们还会时不时有“世界那么大,我想去看看”的念头,或者在突然不想工作的时刻,幻想着自己的家门变成了“任意门 ...

  8. Autodesk 最新开发技术研讨会 -8月22日-Autodesk北京办公室

    为了增进与广大中国地区Autodesk产品的二次开发人员的了解与互动,帮助中国地区的Autodesk产品二次开发人员了解Autodesk最新的二次开发技术动向,并获得Autodesk公司专业开发支持顾 ...

  9. 见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用

    总是邮件.QQ什么的线上聊,让我们见面吧,不怕见光死,呵呵.   我和同事会先抛砖引玉,给大家介绍一下Autodesk几款最新的云技术和解决方案,然后大家就可畅所欲言,自由交流.来自五湖四海的人,为了 ...

随机推荐

  1. DGIS之遥感影像数据获取

    1.概要 在GIS圈的同行或多或少接触过遥感,记得在大学老师就说过"数据是GIS的核心".本文介绍在国内下载遥感影像的方法. 地理空间数据云,这个是中科院计算机网络中心建设的一个免 ...

  2. Windows Server 2008 R2 Enterprise 上用 SqlServer 2008 R2 创建发布出现异常

    标题: 新建发布向导------------------------------ SQL Server 无法将“AC”配置为分发服务器. ------------------------------其 ...

  3. php实现函数可变参数列表

    使用func_get_args().func_num_args().func_get_arg() 可以构造一个可变参数列表的函数. 首先大致介绍以上三个函数. (1)array func_get_ar ...

  4. Manjaro解决 Node.JS Error: ENOSPC

    https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details ...

  5. git提交代码到远程仓库

    1.仓库初始化 git init 2.连接仓库 git remote add origin 仓库地址 3.查看状态 git status 4.将文件添加到暂存区 git add 状态里的新文件 5.将 ...

  6. <数据挖掘导论>读书笔记9聚类分析

    1. 聚类分析仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组. 其目标是组内的对象相互之间是相似的或者相关的,而不同组中的对象是不同的或者不相关的. 2.聚类分析的重要技术 K均值:K均值 ...

  7. pureMVC与strangeIoc框架对比

    前言 最近有机会了解到了StrangeIoc框架,就拿来跟自己比较熟悉的pureMVC进行一下简要的对比.这两套开源框架都是基于MVC模式的扩展,pureMVC是一个跨平台跨语言的MVC轻量级应用框架 ...

  8. 一句话讲清URI、URL、URN

    关于URI,URL ,URN URN(Uniform Resource Name):统一资源名称 URL(Uniform Resource Locator):统一资源定位符 URI(Uniform R ...

  9. JAVA练手--文件操作

    1. File类 主要作用:用于文件和文件夹的创建.查找.删除等操作 public static void main(String[] args) throws IOException { File ...

  10. amazeui笔记-CSS 布局相关

    CSS 等分网格: 说明:.am-avg-sm-2  数字表示几等分 会将子元素 <li>的宽度设置为 50%. 只能用于 <ul> / <ol> 结构 辅助类: ...