将数字排列成最大数 - 算法证明

2024-02-01

有众所周知的算法问题 http://www.programcreek.com/2014/02/leetcode-largest-number-java/,给定数字数组,例如[1, 20, 3, 14]在这种情况下,以尽可能形成最大数字的方式排列数字320141.

SO 和其他网站上有很多解决方案,使用以下算法:

String[] strs = new String[nums.length];
for(int i=0; i<nums.length; i++){
    strs[i] = String.valueOf(nums[i]);
}

Arrays.sort(strs, new Comparator<String>(){
    public int compare(String s1, String s2){
        String leftRight = s1+s2;
        String rightLeft = s2+s1;
        return -leftRight.compareTo(rightLeft);

    }
});

StringBuilder sb = new StringBuilder();
for(String s: strs){
    sb.append(s);
}

return sb.toString();

它当然有效,但我找不到该算法的正式证明。有一个答案quora http://qr.ae/RgAefL,但我不会称其为正式证明。

有人可以给我一份证明草图或参考一些书籍或文章吗?如何从最初的问题得到这个解决方案?

PS我试图解决原来的问题,但我的解决方案是错误的,我无法得到正确的结果,现在我无法完全理解解决方案。


关于符号:我将使用管道来分隔数字,所以它是 更容易看到数字的顺序和结果数在 同时:3|20|14|1

让我们暂时假设这种关系——我们称之为R代表为<=运算符——由比较定义 函数是全序。由表达式决定

-(a+b).compareTo(b+a)

直观地说,如果我们有两个数字a and b and b|a是 比大a|b, b应该获得比a,即它应该 出现在左侧a在解决方案中。如果a|b大于b|a,这是另一种方式 圆形的。如果a|b = b|a,顺序无关紧要。

需要注意的一件重要事情是,这种关系不仅影响两个 数字a and b孤立地考虑但也告诉我们一些事情 关于结果数字,两个数字被嵌入:

If a<=b, then x|a|b|y <= x|b|a|y

with x and y是数量 任意长度。换句话说:如果我们有一个数字序列 我们交换两个相邻的数字a and b with a<=b, 所结果的 之后数字将大于或等于。

例子:3|14|20|1 因为14

我们现在可以假设解决方案不是唯一的 我们的关系暗示R矛盾:我们假设 解决方案是一些不符合的特定顺序R. Since R是一个 总顺序,我们可以重新排列数字以匹配R通过交换 相邻元素直到顺序符合R。这种重新排序可以 与冒泡排序进行比较。然而,在每次交换操作中 引导我们到新的顺序,结果数字增加!这是 显然是矛盾的,所以原来的顺序不可能是 解决方案。

剩下要展示的是R是全序,即 传递性、反对称性和完全性。既然你要的是草图 证明,我将省略这部分。最重要的部分是证明 传递性,即

a and b 暗示一个.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数字排列成最大数 - 算法证明 的相关文章

  • Kamada 和 Kawai 图形布局算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人尝试过 Kamada Kawai 的 88 算法来绘制一般无向图吗 如果是这样 并且您知道其中的任
  • 使用动态编程理解正则表达式字符串匹配

    我遇到了这个问题 要求您实现一个支持 的正则表达式匹配器 和 其中 匹配任何单个字符 匹配零个或多个前面的元素 isMatch aa a false isMatch aa aa true isMatch aaa aa false isMat
  • 如何修复错误嵌套/未闭合的 HTML 标签?

    我需要通过使用正确的嵌套顺序关闭任何打开的标签来清理用户提交的 HTML 我一直在寻找一种算法或Python代码来做到这一点 但除了PHP等中的一些半生不熟的实现之外 还没有找到任何东西 例如 类似的东西 p p ul li Foo bec
  • 使用回溯(而不是 DFS)背后的直觉

    我正在解决单词搜索 https leetcode com problems word search description LeetCode com 上的问题 给定一个 2D 板和一个单词 查找该单词是否存在于网格中 该单词可以由顺序相邻单
  • 将区间映射到更小的区间的算法

    我尝试搜索 但由于问题的性质 我无法找到满意的内容 我的问题如下 我试图将 0 到 2000 范围内的数字 尽管理想情况下上限是可调的 映射到 10 到 100 范围内的更小的区间 上限将映射 2000 gt 100 和下限也是如此 除此之
  • 这个洗牌算法有什么问题吗?

    我一直在做一些休闲假期计算 我的迷你项目是模拟意大利游戏 tomboli 一个关键的组成部分是对以下过程的模拟 游戏由一名男子控制 他拿着一袋 90 个弹珠 编号为 1 到 90 他从袋中随机取出一颗弹珠 每次向玩家喊出弹珠编号 经过一番思
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 如何最小化两个子多边形的最大纵横比?

    我想使用直线将凸多边形切成给定面积比的两部分 以使两个子多边形的较大纵横比最小化 目前我的方法包括选择一个随机起点 计算将多边形分割成目标区域的适当终点 然后计算两个纵横比中较大的一个 然后重复这个很多次 直到我足够接近最小值 多边形 A
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 如何找到最长的回文子序列(不是它的长度)

    我想找出字符串中最长的回文子序列 我到处都找到了找出子序列长度的算法 并声明该算法也可以扩展以返回子序列 但我没有找到如何实现的 有人能解释一下我怎样才能得到序列吗 既然你提到了链接最长回文子序列 http www geeksforgeek
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • 编程 Pearls - 随机选择算法

    Programming Pearls 第一版第 120 页介绍了从 N 个整数总体中选择 M 个等概率随机元素的算法 InitToEmpty Size 0 While Size lt M do T RandInt 1 N if not Me

随机推荐

  • 在正则表达式中使用否定条件

    是否可以在 gsub 表达式中使用负匹配 我想替换以以下开头的字符串hello except那些开始于hello Peter my string gsub hello i 我应该放什么来代替 听起来你想要一个负面的前瞻 gt gt hell
  • Grails - 无法读取 org.grails.plugins:tomcat:zip:8.0.33 的工件描述符

    从今天早上开始 我似乎遇到了 grails 插件存储库的问题 使用 Grails 2 4 4 获取 证书中的主机名不匹配 jfrog io gt 或 jfrog io gt 或 BuildConfig 具有 在插件下构建 org grail
  • Spring Data Rest - 如何在 @RepositoryEventHandler 中接收标头

    我正在使用最新的 Spring Data Rest 并且正在处理该事件 创建之前 我的要求是还捕获提交给POST模型的端点 Client 但是 该界面存储库事件处理程序并没有暴露这一点 Component RepositoryEventHa
  • 将 CardView 置于仅包含一个元素的 RecyclerView 中

    我使用的 RecyclerView 包含带有 TextView 和 ImageView 的 CardView 每张卡代表一个城市 我还在每张卡片上都有一个 onClickListener 它可以引导我找到该城市的博物馆列表 Recycler
  • 如何使用 JSTL 循环遍历字符串中的每个字符?

    如何使用 JSTL 循环遍历字符串中的每个字符 棘手的使用fn substring 会做
  • Angular-Dart DI 库中的工厂注入

    在我的 Dart 应用程序中 我使用 MVP 模式和 Angular dart 依赖注入库 Angular di 在上面的示例中 我无法注入 MyView 或 MyPresenter 因为这是循环依赖项 class MyView MyPre
  • 术语:前向声明与函数原型

    对我来说 使用 C 编程语言时这些术语本质上是同义词 在实践中 我可能更喜欢文件内原型的 前向声明 而不是通过头文件包含的原型的 函数原型 但当你考虑预处理后会发生什么时 即使这也是人为的区别 也许我错过了一些东西 对于何时使用一个术语与另
  • 解构 Open Layers 3 地图

    所以 我使用 Open Layers 3 和 Ember js 来制作仪表板 并且我已经动态加载地图 但我希望它在我离开路线时被销毁 我发现的唯一东西是 map destroy 但它是针对旧版本的API 新版本中似乎没有 进入地图页面几次后
  • 取消设置 git 配置

    我在 Mac 上使用 FileMerge 来查看差异 并设置为 git config global diff external bin git diff cmd sh 现在我不想再使用 FileMerge 如何恢复到之前的默认设置 Use
  • Zsh 无法正确自动完成我的 ssh 命令

    我在 ssh 自动完成方面遇到一些问题 我希望我的 zsh 在我的 ssh config 文件上自动完成 但到目前为止它只对 etc hosts 文件执行此操作 我发现如何通过添加此配置来不使用主机文件 zstyle completion
  • valgrind - 地址 ---- 是分配大小为 8 的块后的 0 字节

    首先 我知道similar已提出问题 但是 我想问一个关于真正原始 C 数据类型的更一般的简单问题 所以就是这样 In main c我调用一个函数来填充这些字符串 int main int argc char argv char host
  • 有没有API可以从wiki页面获取图像

    我想从维基百科页面获取主图像 我有所有维基百科实体名称 我从中创建维基链接并从该页面获取主图像 我尝试过 https github com richardasaurus wiki api https github com richardas
  • 嵌套的纯函数仍然是纯函数吗?

    根据定义 一个纯函数是纯的 如果 给定相同的输入 将始终返回相同的输出 不产生任何副作用 不依赖于外部状态 所以这是一个纯函数 function foo x return x 2 foo 1 2 foo 2 4 foo 3 6 这也将是一个
  • Angular 6 - 材质文本框浮动占位符不起作用

    我想使用 Angular 6 Material UI 组件来提供更高级的外观和感觉 我在测试程序下运行 但 mat 输入没有提供那种外观和感觉 参考 https material angular io components input ov
  • 有没有办法在 iOS 12.2 的 PWA 中使用 mailto: 或 message: 方案?

    我使用 Ionic 4 构建了一个 PWA 它有一个 联系 按钮 其中包含使用 mailto 方案的简单 href a href Contact a 当从主屏幕启动 PWA 时 这用于打开 iOS 12 1 中的本机邮件应用程序 自从我更新
  • 如何获取和/或覆盖 Mac OSX 中窗口的最小尺寸

    我想调整我的机器上的任何窗口的大小 这是我使用 AppleScript 完成的 使用图形用户界面脚本 http www macosxautomation com applescript uiscripting index html 该脚本类
  • 如何计算 JSON 数据中变量的总和?

    我编写了一个项目 其中字符串以相反的方式返回 PostMapping reverse public String reverseList RequestBody String string List
  • 关于Android NDK libc++ libc++_shared、libstdc++的困惑

    我在尝试使用 Android NDK 23 23 1 7779620 构建一个简单的 C 库时感到非常困惑 我正在使用 CMake 这是一个非常简单的程序 CMakeLists txt cmake minimum required VERS
  • Flex:如何创建一个全新的组件?

    我想为 Flex 开发一个网络图形应用程序 想象一下将节点放置在 Canvas 上并用链接将它们连接起来 节点应具有可编辑文本和其他 UI 组件 我试图找到从头开始创建全新 UI 组件的示例 但我所能找到的只是扩展现有组件的琐碎示例 例如
  • 将数字排列成最大数 - 算法证明

    有众所周知的算法问题 http www programcreek com 2014 02 leetcode largest number java 给定数字数组 例如 1 20 3 14 在这种情况下 以尽可能形成最大数字的方式排列数字32