漫画:什么是字典序算法

转载自 漫画:什么是字典序算法?

算法题目:

给定一个正整数,实现一个方法来求出离该整数最近的大于自身的“换位数”。

什么是换位数呢?就是把一个整数各个数位的数字进行全排列,从而得到新的整数。例如53241和23541。

小灰也不知道这种经过换位的整数应该如何称呼,所以姑且称其为“换位数”。

题目要求写一个方法来寻找最近的且大于自身的换位数。比如下面这样:

输入12345,返回12354

输入12354,返回12435

输入12435,返回12453

小灰发现的“规律”:

输入12345,返回12354

12354 - 12345 = 9

刚好相差9的一次方

输入12354,返回12435

12435 - 12354 = 81

刚好相差9的二次方

所以,每次计算最近的换位数,只需要加上9的N次方即可?

————————————

举一个栗子:

给定1,2,3,4,5这几个数字。

最大的组合:54321

最小的组合:12345

比如给定整数12354,如何找到离它最近且大于它的换位数呢?

为了和原数接近,我们需要尽量保持高位不变,低位在最小的范围内变换顺序

那么,究竟需要变换多少位呢?这取决于当前整数的逆序区域

如果所示,12354的逆序区域是最后两位,仅看这两位已经是当前的最大组合。若想最接近原数,又比原数更大,必须从倒数第3位开始改变。

怎样改变呢?12345的倒数第3位是3,我们需要从后面的逆序区域中寻找到刚刚大于3的数字,和3的位置进行互换:

互换后的临时结果是12453,倒数第3位已经确定,这时候最后两位仍然是逆序状态。我们需要把最后两位转变回顺序,以此保证在倒数第3位数值为4的情况下,后两位尽可能小:

这样一来,我们就得到了想要的结果12435

获得最近换位数的三个步骤:

1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界

2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置

3.把原来的逆序区域转为顺序

  1. //主流程,返回最近一个大于自身的相同数字组成的整数。
  2. public static int[] findNearestNumber(int[] numbers){
  3. //拷贝入参,避免直接修改入参
  4. int[] numbersCopy = Arrays.copyOf(numbers, numbers.length);
  5. //1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界
  6. int index = findTransferPoint(numbersCopy);
  7. //如果数字置换边界是0,说明整个数组已经逆序,无法得到更大的相同数字组成的整数,返回自身
  8. if(index == 0){
  9. return null;
  10. }
  11. //2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
  12. exchangeHead(numbersCopy, index);
  13. //3.把原来的逆序区域转为顺序
  14. reverse(numbersCopy, index);
  15. return numbersCopy;
  16. }
  17. private static int findTransferPoint(int[] numbers){
  18. for(int i=numbers.length-1; i>0; i--){
  19. if(numbers[i] > numbers[i-1]){
  20. return i;
  21. }
  22. }
  23. return 0;
  24. }
  25. private static int[] exchangeHead(int[] numbers, int index){
  26. int head = numbers[index-1];
  27. for(int i=numbers.length-1; i>0; i--){
  28. if(head < numbers[i]){
  29. numbers[index-1] = numbers[i];
  30. numbers[i] = head;
  31. break;
  32. }
  33. }
  34. return numbers;
  35. }
  36. private static int[] reverse(int[] num, int index){
  37. for(int i=index,j=num.length-1; i<j; i++,j--){
  38. int temp = num[i];
  39. num[i] = num[j];
  40. num[j] = temp;
  41. }
  42. return num;
  43. }
  44. public static void main(String[] args) {
  45. int[] numbers = {1,2,3,4,5};
  46. for(int i=0; i<10;i++){
  47. numbers = findNearestNumber(numbers);
  48. outputNumbers(numbers);
  49. }
  50. }
  51. //输出数组
  52. private static void outputNumbers(int[] numbers){
  53. for(int i : numbers){
  54. System.out.print(i);
  55. }
  56. System.out.println();
  57. }

这种解法拥有一个高大上的名字:字典序算法

几点补充:

本漫画纯属娱乐,还请大家尽量珍惜当下的工作,切勿模仿小灰的行为哦。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis_user_guide(2)mybatis3.4.0快速入门

【0】README0&#xff09;以下部分内容转自&#xff1a;“mybatis v.3.4.0 User Guide”&#xff1b;1&#xff09;本文旨在梳理 如何 构建 mybatis 环境&#xff0c;与 db 连接&#xff0c;且采用 JUnit 搭建其测试用例&#xff1b;2&#xff09;本文的环境配置都是基于纯 my…

jQuery中的几个案例:隔行变色、复选框全选和全不选

1 表格隔行变色 1 技术分析&#xff1a; 1 &#xff09;基本过滤选择器&#xff1a; odd: even: 2 &#xff09;jq添加和移除样式&#xff1a; addClass(); removeClass(); 2 代码实现 <script src"js/jquery1.11.3/jquery.min.js" type"text/javasc…

从 Linux 源码看 Socket 的阻塞和非阻塞

转载自 从 Linux 源码看 Socket 的阻塞和非阻塞笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码&#xff0c;是一件Exciting的事情。大部分高性能网络框架采用的是非阻塞模式。笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本…

pojo和javabean的区别

【0】README 1&#xff09;本文转自&#xff1a; http://wenku.baidu.com/view/eba89bbcf121dd36a32d828a.html 【1】正文如下&#xff1a; POJO 和JavaBean是我们常见的两个关键字&#xff0c;一般容易混淆&#xff0c;POJO全称是Plain Ordinary Java Object / Pure Old Jav…

使用poi调整字体格式、添加单元格注释、自动调整列宽

1 创建新的工作铺 import java.io.FileOutputStream;import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apa…

MySQL 的索引是什么?怎么优化?

转载自 MySQL 的索引是什么&#xff1f;怎么优化&#xff1f; 摘要: 索引对大数据的查询速度的提升是非常大的&#xff0c;Explain可以帮你分析SQL语句是否用到相关索引。 索引类似大学图书馆建书目索引&#xff0c;可以提高数据检索的效率&#xff0c;降低数据库的IO成本。My…

maven(5)坐标和依赖

【0】README1&#xff09;本文部分文字转自 “maven实战”&#xff0c;旨在 review “maven(5)坐标和依赖” 的相关知识&#xff1b;【2】坐标详解 1&#xff09;intro&#xff1a;坐标用于定位 类库&#xff0c;而一组maven 坐标通过一些元素来进行定义的&#xff1a;groupId…

poi中文api文档

POI中文API文档 一、 POI简介 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。二、 HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写&#xff0c;通过HSSF&#xff0c;你可以用纯Java代码来读取、…

聊聊MyBatis缓存机制

转载自 聊聊MyBatis缓存机制前言MyBatis是常见的Java数据库访问层框架。在日常工作中&#xff0c;开发人员多数情况下是使用MyBatis的默认缓存配置&#xff0c;但是MyBatis缓存机制有一些不足之处&#xff0c;在使用中容易引起脏数据&#xff0c;形成一些潜在的隐患。个人在业务…

maven(6)仓库

【0】README1&#xff09;本文部分文字转自 “maven实战”&#xff0c;旨在 review “maven(6)仓库” 的相关知识&#xff1b; 【1】何为 Maven仓库1&#xff09;intro to 构件&#xff1a;在maven中&#xff0c;任何一个依赖&#xff0c;插件或者项目构建的输出&#xff0c;都…

防止用户重复提交表单数据,session方式,js方式

1. 使用session的方式创建Token令牌解决 创建一个生成令牌的工具类&#xff0c;在该类中有返回类的对象&#xff0c;生成token的方法public class TokenUtil {/**单例设计模式&#xff08;保证类的对象在内存中只有一个&#xff09;*1、把类的构造函数私有*2、自己创建一个类的…

mybatis_user_guide(3)XML配置

【-1】README1&#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/configuration.html#environments【0】MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置&#xff08;settings&#xff09;和属性&#xff08;properties&#xff09;信息。文档的顶层结构如…

easyUI 运用窗口和form表单制作导出功能

这里运用到easyUI的窗口模式和form表单的提交制作一个有条件的导出excel数据统计的功能&#xff0c;主要是知道了怎么运用easyUI的窗口和表单 jsp中&#xff1a;<!-- 导出数据来源条件窗口 --><div id"exportSign" ><form id"condition" me…

分布式一致性算法:可能比你想象得更复杂

转载自 分布式一致性算法&#xff1a;可能比你想象得更复杂分布式系统的难题张大胖遇到了一个难题。他们公司的有个服务器&#xff0c;上面保存着宝贵的数据&#xff0c;领导Bill 为了防止它挂掉&#xff0c; 要求张大胖想想办法把数据做备份。张大胖发挥了抽象的能力&#xff…

mybatis_user_guide(4) Mapper XML 文件

【-1】README 1&#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html【0】SQL 映射文件有很少的几个顶级元素&#xff08;按照它们应该被定义的顺序&#xff09;&#xff1a; cache – 给定命名空间的缓存配置。cache-ref – 其他命名空间缓存配置…

Hibernate关联关系配置(一对多、一对一和多对多)

第一种关联关系&#xff1a;一对多&#xff08;多对一&#xff09; “一对多”是最普遍的映射关系&#xff0c;简单来讲就如消费者与订单的关系。 一对多&#xff1a;从消费者角的度来说一个消费者可以有多个订单&#xff0c;即为一对多。 多对一&#xff1a;从订单的角度来…

3分钟了解“关联规则”推荐

转载自 3分钟了解“关联规则”推荐 “把啤酒放在尿布旁&#xff0c;有助于提升啤酒销售量”是关联规则推荐的经典案例&#xff0c;今天&#xff0c;和大家聊聊“关联规则推荐”&#xff0c;正文不含任何公式&#xff0c;保证PM弄懂。一、概念 什么是关联规则&#xff08;Associ…

mybatis_user_guide(5) 动态 SQL

【-1】README 1&#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 【0】动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元…

sqlserver还原差异备份

因为之前遇到还原差异备份&#xff0c;最开始遇到SQLServer报错&#xff1a;”无法还原日志备份或差异备份&#xff0c;因为没有文件可用于前滚“。查阅很多资料后&#xff0c;终于得到解决。收集整理成这篇随笔。   问题原因&#xff1a;出现这种错误绝大多数是因为还原完整…

1分钟了解相似性推荐

转载自 1分钟了解相似性推荐前几天聊的“协同过滤&#xff08;Collaborative Filtering&#xff09;”和“基于内容的推荐&#xff08;Content-based Recommendation&#xff09;”&#xff0c;都必须分析用户的历史行为数据&#xff08;例如电影点击数据&#xff0c;职位查看数…