题目:

给出1个正整数,找到用与这个数字相同的digit组成的整数中比这个数字大的数集中的最小数字。比如:12352874 的结果是 12354278

分析:

这道题目的考虑目标是数组的查找与排序.

当然, 前提是你得明白这道题目的思路是什么样子的. 把正整数转化为char数组a, 长度为n, 末尾字符是a[n-1], 然后对该数组逆序查找, 会发现, 第一个a[n-1]比小的字符是a[i], 然后字符a[i]跟a[n-1]交换, 最后对数组中i+1到n-1的部分进行升级排序, 你会发现, 正是最后的结果正是比目标整数大的数集中最小的数字.

示例中数字的分析过程为:

[1, 2, 3, 5, 2, 8, 7, 4]

^

[1, 2, 3, 5, 2, 8, 7, 4]

^(2 < 4, 交换)

[1, 2, 3, 5, 4, 8, 7, 2]

^, 然后对后三位字符升级排序, 结果为:

[1, 2, 3, 5, 4, 2, 7, 8]

同样, 再对上述结果继续上述操作, 其后续结果依次是:

[1, 2, 3, 5, 4, 2, 8, 7]

[1, 2, 3, 5, 4, 7, 2, 8]

[1, 2, 3, 5, 4, 7, 8, 2]

[2, 1, 2, 3, 4, 5, 7, 8]

......

由此, 上述思路的Java代码实现为:

    public int findCeil(int src) {
char[] chars = String.valueOf(src).toCharArray();
int index = -1;
int lastIndex = chars.length - 1;
char lastChar = chars[lastIndex];
for (int i = chars.length - 2; i > -1; i--) {
if (chars[i] < lastChar) {
index = i;
break;
}
}
if (index > -1) {
char ch = chars[index];
chars[index] = lastChar;
chars[lastIndex] = ch;
quickSort(chars, index + 1, lastIndex);
}
return Integer.parseInt(String.valueOf(chars));
}

然后, 其中为char数组进行快速排序的算法如下:

    public void quickSort(char[] chars, int start, int end) {
if (chars != null && start > -1 && end < chars.length && start < end) {
int i = start, j = end;
char value = chars[start];
while (i < j) {
while (j > start && chars[j] >= value) {
j--;
}
if (i < j) {
chars[i] = chars[j];
i++;
}
while (i < end && chars[i] < value) {
i++;
}
if (i < j) {
chars[j] = chars[i];
j--;
}
chars[i] = value;
quickSort(chars, start, i);
quickSort(chars, i + 1, end);
}
}
}

Update:

后来又想了一下, 上面的findCeil(int)方法并不完美. 如果给定1570, 目标数应该为1705, 但是findCeil(int)并不能找出来.

思路应该修改下: 当最后一个元素, 逆向遍历并不存在比它小的元素时, 应该再次从倒数第二个元素, 开始逆向遍历查找比它小的元素, 如果还找不到, 则从倒数第三个元素开始, 依此类推.

所以, 更新后的findCei(int)方法为:

 public int findCeil(int src) {
char[] chars = String.valueOf(src).toCharArray();
for (int i = chars.length - 1; i> -1; i--) {
  int index = -1;
  int lastIndex = i;
  char lastChar = chars[lastIndex];
 for (int j = i - 1; j > -1; j--) {
 if (chars[i] < lastChar) {
 index = i;
 break;
 }
 }
 if (index > -1) {
 char ch = chars[index];
 chars[index] = lastChar;
 chars[lastIndex] = ch;
 quickSort(chars, index + 1, chars.length - 1);
 return Integer.parseInt(String.valueOf(chars));
 } else {
 continue;
 }
}
return src;
}

然后, 这题题目就完美的解决啦!

算法-找出与目标数字相同的digit组成的整数中比该数字大的数集中的最小数字的更多相关文章

  1. 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数

    找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...

  2. 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数

    问题描述: 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数. 算法一: 对数组a[n]进行冒泡排序,如果冒泡所得的最值和前一个最值相等,则该最值为重复的数. 分析: 该算法时间复杂 ...

  3. [PHP] 算法-找出两个链表的第一个公共结点的PHP实现

    输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移 ...

  4. 15. 3Sum_左右开工,遍历找出符合目标的数字

    题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...

  5. 有一个array的数组,长度为10000,大小不一,用算法找出该数组中的最大值。

    不用算法的答案是:   var a=[1,2,3,5……];alert(Math.max.apply(null, a));//最大值alert(Math.min.apply(null, a));//最 ...

  6. 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数

    #include<iostream> using namespace std; //#define maxn 2000010 #include<stdio.h> //int a ...

  7. Java实现 LeetCode 719 找出第 k 小的距离对(二分搜索法+二分猜数字)

    719. 找出第 k 小的距离对 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入: nums = [1,3, ...

  8. 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?

    给定a.b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a.b文件共同的url? 可以估计每个文件的大小为5G*64=300G,远大于4G.所以不可能将其完全加载到 ...

  9. C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id

    紧接上一篇,将List<Menu>的扁平结构数据, 转换成树形结构的数据 返回给前端   ,   废话不多说,开撸! --------------------- 步骤: 1. 建 Menu ...

随机推荐

  1. pip install python 如何快速安装模块

    之前python安装模块要在网络上下载,从python2.7.9之后,以及python3,python就自带pip 这个命令,能够快速的安装模块 1,  首先打开python的主文件夹 2.在主文件夹 ...

  2. !Web云笔记--HTML基础

    Web自学笔记第一阶段笔记综合汇总 参考资料:<Head First HTML&CSS>(中文第二版)(美国)弗里昂ISBN:9787508356464 中国电力出版社 全部阶段: ...

  3. [转载]python 详解re模块

    原文地址:python 详解re模块作者:Rocky 正则表达式的元字符有. ^ $ * ? { [ ] | ( ) .表示任意字符 []用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字 ...

  4. ServletRequest的一些知识点

    浏览器向服务器的请求(浏览器将数据发送给服务器时,数据存放的地方) 请求方式:GET和POST * GET:发送的数据,追加在请求的URL之上 * POST:发送的数据在HTTP请求体中 浏览器发送数 ...

  5. 团队作业8——第二次项目冲刺(Beta版本)5.24

    1.当天站立式会议照片 会议内容 1.总结前几次会议中出现的问题. 2.对第二天需要做的任务进行分配. 3.询问团队队员任务完成情况以及时间分配是否充分. 4.对今后的任务,发表自己的看法. 2.每个 ...

  6. 个人作业3—个人总结(Alpha阶段)

    一.个人总结 在Alpha阶段,我们团队通过合作的方式,完成了之前觉得不大可能会完成的事(至少在我看来是这样的),大家其实之前的写代码能力都不太好,这期间大家都是边学边做,边做边学,最后跌跌撞撞的完成 ...

  7. 201521123069 《Java程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. (1)我们可以利用堆栈追踪来获得异常发生的根源(堆栈追踪信息最顶层). (2)自定义异常:不是由Java系统 ...

  8. 201521123070 《JAVA程序设计》第9周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 ...

  9. 多线程面试题系列(14):读者写者问题继 读写锁SRWLock

    在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...

  10. node 当中的 cnpm和npm 的区别和使用

    在安装nodejs之后会有npm命令 打开命令符输入之后 输入node -v(记得-v前空格)查看版本信息   如果显示出来了就说明安装成功 然后 npm 可以安装node插件 cnpm使用的是淘宝网 ...