算法-找出与目标数字相同的digit组成的整数中比该数字大的数集中的最小数字
题目:
给出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组成的整数中比该数字大的数集中的最小数字的更多相关文章
- 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...
- 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数
问题描述: 数组a[n]中存放1-n中的n-1个数,给出算法找出重复的那一个数. 算法一: 对数组a[n]进行冒泡排序,如果冒泡所得的最值和前一个最值相等,则该最值为重复的数. 分析: 该算法时间复杂 ...
- [PHP] 算法-找出两个链表的第一个公共结点的PHP实现
输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移 ...
- 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 ...
- 有一个array的数组,长度为10000,大小不一,用算法找出该数组中的最大值。
不用算法的答案是: var a=[1,2,3,5……];alert(Math.max.apply(null, a));//最大值alert(Math.min.apply(null, a));//最 ...
- 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
#include<iostream> using namespace std; //#define maxn 2000010 #include<stdio.h> //int a ...
- Java实现 LeetCode 719 找出第 k 小的距离对(二分搜索法+二分猜数字)
719. 找出第 k 小的距离对 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入: nums = [1,3, ...
- 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?
给定a.b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a.b文件共同的url? 可以估计每个文件的大小为5G*64=300G,远大于4G.所以不可能将其完全加载到 ...
- C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id
紧接上一篇,将List<Menu>的扁平结构数据, 转换成树形结构的数据 返回给前端 , 废话不多说,开撸! --------------------- 步骤: 1. 建 Menu ...
随机推荐
- Membership ——入门基础
Membership是ASP.NET为我们提供的一套验证和存储用户凭证的框架.它可以帮助我们快速的开发用户登录.管理以及权限验证相关的模块,很多人可能会说Membership开发起来确实很快,但是总是 ...
- 原生的AJAX
var XHR=null; if (window.XMLHttpRequest) { // 非IE内核 XHR = new XMLHttpRequest(); } else if (window.Ac ...
- java环境安装说明
Java从安装到运行第一个程序 对于初学者来说,能否成功运行第一个Java程序,关系到这杯咖啡的口感. 作为才疏学浅的常年初学者,语言描述不清,还是上图吧! 一.安装JDK 打开网址http://ww ...
- CCNA+NP学习笔记—序章
本人就读于南京捷式泰网络科技有限公司学习CCIE,这几天准备将多年来的纸质版笔记全部写成电子版献给大家以留下自己学习的足迹.本章是基础篇章,内容较少,主要为之后的内容做铺垫.所有笔记的分类顺序为:序章 ...
- 201521123075 《Java程序设计》第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...
- JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作, ...
- Ring3层 UNICODE_STRING
今天写驱动用到UNICODE_STRING,就在Ring3层抠了一些源代码,学习一下,不多说了上代码了 #pragma once #include <windows.h> #include ...
- Hibernate第八篇【懒加载】
前言 前面在使用Hibernate的时候就提及过了懒加载,但没有好好地说明具体的说明究竟是怎么回事-本博文主要讲解懒加载 什么是拦截器以及为什么要使用懒加载? 懒加载就是当使用数据的时候才去获取数据. ...
- 02函数-04-箭头函数(ES6)
ES6新增的函数:Arrow Function,定义方式就是一个箭头 箭头函数相当于匿名函数,并且简化了函数定义,和匿名函数最大的区别在于其内部的this不再"乱跑",而是由上下文 ...
- Spring02-AOP
1,动态代理,指的是通过一个代理对象创建需要的业务对象,然后在这个代理对象中统一进行各种操作. 步骤: 1)写一个类实现InvocationHandler接口: 2)创建要代理的对象 2,创建一个简单 ...