重新排列数字使其刚好比当前值大 Next Greater Element III
为什么80%的码农都做不了架构师?>>>
问题:
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly the same digits existing in the integer n and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.
Example 1:
Input: 12 Output: 21
Example 2:
Input: 21 Output: -1
解决:
【题意】给定一个正的32位整数n,你需要找到最小的32位整数,其整数n中的数字完全相同,并且数值大于n。 如果不存在这样的正32位整数,则需要返回-1。
① 本题实质上可以转换为求当前全排列的下一个排列(Next Permutation)。所以,从后向前扫描,找到第一个降序的位置,然后找到右侧第一个大于该位置的值的数,交换这两个数,然后反转该位置之后的数,就可以得到想要的结果。如果整体都是升序的,就返回-1.
1 2 7 4 3 1 ----- 找到第一个降序的位置
1 2 7 4 3 1 ----- 找到其右侧开始找第一个大于它的值
1 3 7 4 2 1 ----- 交换这两个值
1 3 1 2 4 7 ----- 因为开头变了,反转之后的排列
class Solution {//4ms
public int nextGreaterElement(int n) {
String str = String.valueOf(n);
char[] schar = str.toCharArray();
int len = schar.length;
int i;
for (i = len - 1;i > 0;i --){
if (schar[i] > schar[i - 1]) break;
}
if (i == 0) return -1;
for (int j = len - 1;j >= i;j --){
if (schar[j] > schar[i - 1]){
swap(schar,i - 1,j);
break;
}
}
reverse(schar,i,schar.length - 1);
long res = Long.parseLong(String.valueOf(schar));//防止转换后的结果越界
return res > Integer.MAX_VALUE ? -1 : (int)res;
}
public void swap(char[] schar,int i,int j){
char tmp = schar[i];
schar[i] = schar[j];
schar[j] = tmp;
}
public void reverse(char[] schar,int i,int j){
while (i < j){
swap(schar,i ++,j --);
}
}
}
转载于:https://my.oschina.net/liyurong/blog/1605052
重新排列数字使其刚好比当前值大 Next Greater Element III相关推荐
- dfs入门排列数字问题(一看就懂的讲解)
dfs入门排列数字问题 dfs入门排列数字问题 一.问题概述 二.问题分析 三.代码分析 (一).如何表示填写完成 (二).如何判断该填哪个数 (三).如何表示填空 (四).实现dfs 四.代码全览 ...
- DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
DFS (深搜), 也有说就是递归的 执着: 一直搜到底,然后回溯下一个节点 数据结构 : stack (这里的栈,实际上是编译器内部的栈, 所以说也可以看成递归, 递归内部也是调用编译器内部栈) 空 ...
- ---排列数字---
排列数字(回溯的应用) 题目链接,点击直达 题解: 1.用path数组来保存排列 2.bool st[]数组来标识当前数字是否被用过 3.dfs继续递归下一层 4,恢复现场,第 i 个位置填写某个数字 ...
- 在()里填上1—9这九个数字使除法算式成立,每个括号内的数字不相同。
在()里填上1-9这九个数字使算式成立,每个括号内的数字不相同. ()()/()=()()/()=()()/() 符合条件的算式有三组,他们的求解结果分别是7.5,7和9 ('19/2', '38/4 ...
- python代码 输入数字使其反向输出
# 输入数字使其反向输出num = int(input("请输入一个数:"))i = 0num1 = numwhile True:if num1 // 10 == 0:breaki ...
- python求组合数c_python实现排列组合公式C(m,n)求值
python实现排列组合公式C(m,n)求值 实验六 理解浮点数运算的误差 实验目的: 1.理解组合数定义式的化简 2.理解浮点数运算的误差可能带来的问题 错误代码 def func(m,n): re ...
- 数字经济建设在数字新技术体系上,数字新技术主要包括物联网、云计算、大数据、人工智能、区块链等五大技术
40年以来,中国经济发展经历两大历史性变革,第一次是20世纪八九十年代,从计划经济转向市场经济,社会生产力大解放,经济高速度增长,中国成为世界第二大经济体,实现第一次历史性的大变革.第二次是21世纪从 ...
- ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
题目描述 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. 输入 两个数,空格隔开 输出 交换后的两个数,空格隔开 样例输入 1 2 样例输出 2 ...
- 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )
文章目录 安卓直播推流专栏博客总结 一. NV21 图像数据中的 YUV 数据简介 二.向 x264 编码图片 三. 提取 NV21 数据中的灰度数据 Y 四. 提取 NV21 数据中的饱和度数据 U ...
最新文章
- 100G内存下,MySQL查询200G大表会OOM么?
- winform datagridview 重新绘制datagridview的边框。
- 【采用】规则引擎Pyke与PyClips对比研究报告(高大上啊,第一次听说pyke和pyclips这俩词~)
- 重磅发布!吴恩达 AI 完整课程资源超级大汇总!
- Fedora 10成功安装KDE4.2正式版
- ITK:过滤图像FilterImage
- CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)
- 从东岳流体下载自带OpenFOAM的Vmware虚拟机(Ubuntu20.04+OpenFOAM),无法共享文件夹【终极解决方案】
- jquery中方法扩展 ($.fn $.extend) 学习笔记
- 使用浏览器地址栏调用CXF Webservice的写法
- 【sklearn第二十一讲】矩阵分解问题
- 栅栏密码怎么写java程序_栅栏密码
- win7怎么关uac_win7电脑如何关闭uac用户账户控制
- python语言count什么意思_python中count函数是什么意思?
- java高级软件工程师证书国家,看完这篇彻底明白了
- bzoj3654 图样图森破
- 差模、共模、奇模、偶模的区别与差异
- 基于深度学习的单视图三维重建算法学习路线
- 含论文基于JAVA的户籍信息管理系统【数据库设计、源码、开题报告】
- 多址接入技术 FDMA TDMA CDMA NOMA
热门文章
- 如何将excel里的数据批量导入ACCESS,要用vb代码?
- 全程快捷键!硬核小哥超快配图1700页数学笔记,教你上手LaTeX+Inkscape
- 百度云2019落地第一枪打响:两款智能边缘硬件,让城市环卫、农药喷洒都AI起来...
- 马斯克新梦想迈出第一步!首条地下高速隧道即将完工,12月免费体验
- 北大教授证明黎曼猜想?但在前一天取消了
- 2018网易未来科技峰会召开,科技新浪潮改变商业
- 纯新手入门机器/深度学习自学指南(附一个月速成方案)
- 原生JS实现简易转盘抽奖
- C++ String封装
- 判断并输出打印前一百个回文素数,每行10个