面试题----寻找比一个N位数大的“下”一个数
- 题目描述
写出一个算法,实现如下功能:
给定一个N位数字组成的数,找出比这个数大的由相同数字组成的下一个数
例如:如果数字为 25468, 则结果为25486 如果数字为 21765, 则结果为 25167 如果数字为 54321, 则结果为 54321 (因为没有比这个数大的相同数字组成的值)
2.问题分析
- 因为N是一个没有范围的数,因此在解决此题时排出用N-位整数作为输入,而是用字符串来处理
- 若存在有连续数字是相同的应该如何处理?
- 观察例子可以得到如下思路
一个N数如83557761,从右往左,找到当前位置上的数比它左边的数大为止(相等也要继续),即找到左边第一个7,比5大,得到7761,逆序为1677,然后从左往右找到第一个比5大的数6,交换5和6,即得到83561577。
3.此算法一般性讲解
把N位数分为两部分前i位和后N-i位,其中后N-i位从右往左是不减的(要么递增,要么相等),因此,不管怎样调这N-i,数都不会增大。按前面的分法,第i位一定比第i+1位小,也可能比第i+2位小,以此类推,找到第i+j位数,它比第i位数大,但是第i+j+1位数比第i位数小,交换第i位和第i+j位,然后提取i+1到第i+j-1这部分数字和第i+j+1到第N位的数字,这两部分分别逆序之后交换位置放置即可。结合例子可以理解。
4.代码和注释
1 #include<iostream> 2 #include<string> 3 #include <algorithm> 4 using namespace std; 5 6 7 int main() 8 { 9 string digit; 10 cin >> digit; 11 12 int len,i,j; 13 len = digit.length(); 14 //N<=1直接输出 15 if(len <= 1) 16 { 17 cout << digit<<endl; 18 return 0; 19 } 20 //当digit中有连续的相同数字,在从右到左遍历时仍然继续遍历 21 for(i=len-1;i>=1;i--) 22 if(digit[i]>digit[i-1])break; 23 24 //digit从右到左都是不减的,则不用调整 25 if(i==0) 26 { 27 cout << digit<<endl; 28 return 0; 29 } 30 //提取前i位 31 string pre = digit.substr(0,i); 32 //提取后N-i位 33 string end = digit.substr(i,len-i); 34 35 reverse(end.begin(), end.end()); //逆序 36 37 38 int index = pre.length(); 39 int num =pre[index-1]; 40 for(j=0;j<end.length();j++) 41 if(end[j]>=num)break; 42 43 //交换第i位和第i+j位 44 pre[index-1] = end[j]; 45 end[j]=num; 46 47 digit = pre+end;//合并即可 48 49 cout<<digit<<endl; 50 return 0; 51 }
转载于:https://www.cnblogs.com/LCCRNblog/p/3659437.html
面试题----寻找比一个N位数大的“下”一个数相关推荐
- C语言拆分一个三位数。以及交换两个数(常规法复习加指针法学习)
给一个三位数,要求拆分出百位十位,个位.然后输出. 以前我们在水仙花那次求水仙花数 提到过经典的取法 我们再次展示一下: #include<stdio.h> int main() {int ...
- 李嘉诚长江商学院演讲汇总:大时代下的商道
我每次出门,在机场都能看到很多关于我的传记这类书籍.不知道什么原因,很多人感兴趣的题目总是有关赚钱.既然那么多人有兴趣,我今天便谈谈赚钱的艺术. 首先,回顾一下我与长和系的发展里程碑.我是在1940年 ...
- 网易16年研发实习生笔试题 - 寻找第K大
### 问题 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 输入样例 [1,3, ...
- 用c语言编写:从健盘输入一个两位数的正整数 a,将其转换形成一个整数b并输出b。 转换的方式是:将a中较大的数码作为b的十位,剩余的数码作为上的个位。例如,当输入a =49,则结果 b=94...
#include <stdio.h> int main(){ int a; int b; printf("请输入一个两位数的正整数a:"); scanf("% ...
- ACMNO.10打印出所有水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 Output: 153 ???
题目描述 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身. 例如:153是一个水仙花数,因为153=1^3+5^3+3^3. ...
- [html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么?
[html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么? 适配 清晰度 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与 ...
- C语言编写一个四位数的和,c语言编写一段程序,输入一个四位数,输出各位数字的和...
用C语言编写程序,输入一个正整数n(1 #include"stdio.h"intmain(){\x09inti,j,n;\x09inta[12];\x09intmin,mx;\x0 ...
- python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数
从键盘任意输入一个3位整数,编程计算并输出它的逆序数 程序哪里错了??为什么输出的是一个长长的负数 编写程序,输入一个3位正整数, www.zhiqu.org 时间: 2020-11-24 # ...
- Java面试题(一)100家大公司java笔试题汇总
Java考试题 一:单选题 -– 1.下列哪一种叙述是正确的(D ) A. abstract修饰符可修饰字段.方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括 ...
最新文章
- 2018全球智能+新商业峰会倒计时2个月,5000名AI从业者将出席
- 取消Exchange数据库的自动分配功能
- 加载dict_Python的dict实现原理和Java的HashMap之间的区别
- MySQL复习资料(八)——MySQL-事务
- mysql基础_月隐学python第22课
- php 显示数据库操作错误,php操作mysql数据库编码错误
- 程序员面试金典 - 面试题 04.04. 检查平衡性(二叉树高度)
- java拓展接口_Java拓展接口-default关键词
- 客户管理系统登录PSD模板
- 2021-2025年中国传感器融合行业市场供需与战略研究报告
- 这五款热门商用密码管理器中均存在缺陷,可导致用户凭证被盗
- Linux 命令(72)—— ulimit 命令(builtin)
- Linux基础—2.Linux中的文件基本命令以及四大远程连接工具XShell、FileZilla、Notepad++、Xmanager4的使用
- 论文简述 | Line Flow Based SLAM
- 两个app应用之间的跳转
- 回归分析的几个问题:异方差性、自相关性、多重共线性
- 电机系列(1) - foc最基本原理、clark变换 、park变换、附代码
- leetcode 155. Min Stack最小栈(中等)
- Yuga Labs大举扩张,“猿”宇宙已经不远了?
- 如何分发大文件、大文件断点续传解决方案