算法-找出与目标数字相同的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 ...
随机推荐
- webservice Dome--一个webservice的简单小实例
1.理解:webservice就是为了实现不同服务器上不同应用程序的之间的通讯 2.让我们一步一步的来做一个webservice的简单应用 1)新建一个空的web应用程序,在程序上右键,新建项目,选择 ...
- JavaScript封装一个MyAlert弹出框
平时我们想要显示一些提示信息时会用到alert方法,alert是全局的一个方法,会短暂的中断程序,我们主要用来显示提示客户信息.但是这个方法有一定的局限性,而且本身样式也不够美观.于是我封装了一个实用 ...
- Wireshark抓包TCP三次握手数据
抓包工具 - Wireshark(详细介绍与TCP三次握手数据分析) 功能使用的详细介绍 wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封 ...
- 必应词典--英语学习APP案例分析
一.调研,评测 1.个人上手体验 这还是第一次听说必应词典,只能说知名度有待提高啊.首先,下载打开必应词典的第一感觉就是不够美观,个人感觉不论图标还是界面的美感都不足,既繁琐有简洁,给人的最直观感受就 ...
- 【1414软工助教】团队作业2——需求分析&原型设计 得分榜
题目 团队作业2--需求分析&原型设计 作业提交情况情况 本次作业所有团队都按时提交作业. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 ...
- 201521123062 《Java程序设计》第3周学习总结
1.本周学习总结 二.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pu ...
- 201521123053《Java程序设计》第十周学习总结
---恢复内容开始--- 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 在java多线程程序中,所有线程都不允许抛出未捕获的checked excepti ...
- 201521123116 《java程序设计》第十二周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 Q1.字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) ...
- 201521123074 《Java程序设计》第1周学习总结
1. 本章学习总结第一周学习总结: 学习了java语言的历史与发展,运行过程,安装了eclipse编程平台,试着编写了java程序. 2. 书面作业: Q 1.为什么java程序可以跨平台运行?执行j ...
- 【干货】教你如何利用fullPage.js以及move.js插件打造高端大气的网站效果!
前言: 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次. 在学习过jQuery插件之后,才发现之前的很多网站特效完全可 ...