题目:
给出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 ...
随机推荐
-
Java入门(二)——果然断更的都是要受惩罚的。。。
断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写 ...
-
CodeIgniter 引入自定义公共函数
CodeIgniter 中公共函数不能追加,可以通过 helper 辅助函数实现. 创建 common_helper.php 文件,定义所需公共函数,存放至 application/helpers 目 ...
-
set_exception_handler 和 set_error_handler 函数
定义和用法 set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 nul ...
-
web HTML5 调用摄像头的代码
最近公司要求做一个在线拍照的功能,具体代码如下: <html> <head> <title>html5调用摄像头拍照</title> <style ...
-
MySQL数据库下用户及用户权限配置
问题:使用某大腿写的远程工具管理Mysql数据库时发现所有数据能正常显示,但是无法进行删除.修改等操作. 思路:可以远程读取到数据库里的信息,说明当前主机可以远程连接数据库.却无法进行删除.修改这些操 ...
-
ANDROID_MARS学习笔记_S02_008_ANIMATION第二种使用方式:xml
一.简介 二.代码1.res\anim下的xml(1)alpha.xml.xml <?xml version="1.0" encoding="utf-8" ...
-
java调用C++ DLL库方法
最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...
-
Android系统APN配置具体解释
Android 系统APN配置具体解释 这些天一直在调系统原生的Settings.apk里面APN配置的问题.在设置里面手动添加了APN配置选项.可是在界面上还是看不到.所以跟了下代码.原以为就是简 ...
-
php中常用的字符串长度函数strlen()与mb_strlen()实例解释
int strlen ( string $string ) int strlen ( string $string ) 获取给定字符串的[字节]长度 成功则返回字符串$string的长度,如果$s ...
-
基于Kafka Connect框架DataPipeline在实时数据集成上做了哪些提升?
在不断满足当前企业客户数据集成需求的同时,DataPipeline也基于Kafka Connect 框架做了很多非常重要的提升. 1. 系统架构层面. DataPipeline引入DataPipeli ...