1. 题目描述

写出一个算法,实现如下功能:

给定一个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位数大的“下”一个数相关推荐

  1. C语言拆分一个三位数。以及交换两个数(常规法复习加指针法学习)

    给一个三位数,要求拆分出百位十位,个位.然后输出. 以前我们在水仙花那次求水仙花数 提到过经典的取法 我们再次展示一下: #include<stdio.h> int main() {int ...

  2. 李嘉诚长江商学院演讲汇总:大时代下的商道

    我每次出门,在机场都能看到很多关于我的传记这类书籍.不知道什么原因,很多人感兴趣的题目总是有关赚钱.既然那么多人有兴趣,我今天便谈谈赚钱的艺术. 首先,回顾一下我与长和系的发展里程碑.我是在1940年 ...

  3. 网易16年研发实习生笔试题 - 寻找第K大

    ### 问题 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 输入样例 [1,3, ...

  4. 用c语言编写:从健盘输入一个两位数的正整数 a,将其转换形成一个整数b并输出b。 转换的方式是:将a中较大的数码作为b的十位,剩余的数码作为上的个位。例如,当输入a =49,则结果 b=94...

    #include <stdio.h> int main(){ int a; int b; printf("请输入一个两位数的正整数a:"); scanf("% ...

  5. ACMNO.10打印出所有水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 Output: 153 ???

    题目描述 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身. 例如:153是一个水仙花数,因为153=1^3+5^3+3^3. ...

  6. [html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么?

    [html] 如果要开发一个在超级大屏上显示的可视化页面,你首先要考虑什么? 适配 清晰度 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与 ...

  7. C语言编写一个四位数的和,c语言编写一段程序,输入一个四位数,输出各位数字的和...

    用C语言编写程序,输入一个正整数n(1 #include"stdio.h"intmain(){\x09inti,j,n;\x09inta[12];\x09intmin,mx;\x0 ...

  8. python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数

    从键盘任意输入一个3位整数,编程计算并输出它的逆序数 程序哪里错了??为什么输出的是一个长长的负数 编写程序,输入一个3位正整数, www.zhiqu.org     时间: 2020-11-24 # ...

  9. Java面试题(一)100家大公司java笔试题汇总

    Java考试题 一:单选题 -– 1.下列哪一种叙述是正确的(D ) A. abstract修饰符可修饰字段.方法和类 B. 抽象方法的body部分必须用一对大括号{ }包住 C. 声明抽象方法,大括 ...

最新文章

  1. 2018全球智能+新商业峰会倒计时2个月,5000名AI从业者将出席
  2. 取消Exchange数据库的自动分配功能
  3. 加载dict_Python的dict实现原理和Java的HashMap之间的区别
  4. MySQL复习资料(八)——MySQL-事务
  5. mysql基础_月隐学python第22课
  6. php 显示数据库操作错误,php操作mysql数据库编码错误
  7. 程序员面试金典 - 面试题 04.04. 检查平衡性(二叉树高度)
  8. java拓展接口_Java拓展接口-default关键词
  9. 客户管理系统登录PSD模板
  10. 2021-2025年中国传感器融合行业市场供需与战略研究报告
  11. 这五款热门商用密码管理器中均存在缺陷,可导致用户凭证被盗
  12. Linux 命令(72)—— ulimit 命令(builtin)
  13. Linux基础—2.Linux中的文件基本命令以及四大远程连接工具XShell、FileZilla、Notepad++、Xmanager4的使用
  14. 论文简述 | Line Flow Based SLAM
  15. 两个app应用之间的跳转
  16. 回归分析的几个问题:异方差性、自相关性、多重共线性
  17. 电机系列(1) - foc最基本原理、clark变换 、park变换、附代码
  18. leetcode 155. Min Stack最小栈(中等)
  19. Yuga Labs大举扩张,“猿”宇宙已经不远了?
  20. 如何分发大文件、大文件断点续传解决方案

热门文章

  1. c#初学-索引器get和set的使用(泛型类)
  2. 3.1 数据链路层功能概述
  3. sublime编辑器中文乱码的问题
  4. 数据结构基础-Hash Table详解
  5. java自定义sql查询插件,Mybatis插件plugin应用测试,替换查询sql
  6. github使用教程及小问题
  7. Python----Day1
  8. wine 安装.netframework 2.0方法
  9. Mybatis打印调试sql的两种方式
  10. python——画一个笑脸