java笔试题--给定任意一个自然数,获取它重新排列后,下一个比它大的自然数
2019-03-09 01:11
155 查看
package com.zjp.start.sort; import java.util.ArrayList; /** * 给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n) */ public class NextBigNum { public static void main(String[] args) { int num = 1347654; String nextInt = findNextInt(num); System.out.println(nextInt); } private static String findNextInt(int num) { //将该自然数放入数组 ArrayList<Integer> nums = new ArrayList<Integer>(); while (num % 10 > 0) { nums.add(0, num % 10); num = num / 10; } //为了和原数接近,我们要保持高位不变,低位在最小范围内变换顺序 //从右向左寻找逆序区域的临界值 int cricitalPoint = findCricitalPoint(nums); if (cricitalPoint == -1) { //不存在 return "不存在"; } else { //存在,就把临界值的前一个数和逆序区域中刚刚大于该数的数字交换位置,然后把逆序区域变为顺序 return reorder(nums, cricitalPoint); } } /** * 寻找逆序区域的临界值 * * @param nums * @return */ private static int findCricitalPoint(ArrayList<Integer> nums) { for (int i = nums.size() - 1; i > 0; i--) { if (nums.get(i) > nums.get(i - 1)) { return i; } } return -1; } /** * 把逆序区域临界值的前一位和逆序区域中刚刚大于该数的数字交换位置,并把逆序区域变为顺序 * * @param nums * @param index * @return */ private static String reorder(ArrayList<Integer> nums, int index) { //把逆序临界值的前一位和逆序区域中刚刚大于该数的数字交换位置 //记录临界值的前一个数 int left = nums.get(index - 1); for (int i = nums.size() - 1; i >= index; i--) {//循环逆序区域 int right = nums.get(i); if (left < right) { nums.set(index - 1, right); nums.set(i, left); break; } } //把逆序区域变为顺序 for (int i = index, j = nums.size() - 1; i < j; i++, j--) { int tmp = nums.get(i); nums.set(i, nums.get(j)); nums.set(j, tmp); } return nums.toString(); } }
相关文章推荐
- 用JAVA写一个函数,功能如下: 任意给定一组数, 找出任意数相加之后的结果为35(任意设定)的情况
- java实现List集合中获取上一个下一个元素
- 给定一个任意长度的java数组,求数组内的数能组合出来的最大整数
- JAVA函数实现任意给定一组数, 找出任意数相加等于某数或者在一个范围
- 任意给定一个自然数N,要求M是N的倍数,且他的所有各位数字都是由0或1组成,并要求M尽可能小
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
- java笔试题-给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- PHP 获取数组任意下标key的上一个prev和下一个next下标值
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- Java作业:给定任意一个目录 ,以树形方式展示出该目录中的所有子目录和文件。另外,在展现的时候将目录排在上面,文件排在下面。每一层要加上缩进
- java实现输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- Java 给定一个月份,获取该月份的前面12个月份
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- java 面试题 请设计一个方法,可以实现获取任意范围内的随机数
- 寒假的时候,小明同学要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上。小明可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点,然后才能去访问下一个朋友。
- 给定一个平面内三个不同的点p1、p2和p3,求出任意两点(即点p1和点p2、点p1和点p3、点p2和点p3)之间的距离。