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.代码和注释

 #include<iostream>
#include<string>
#include <algorithm>
using namespace std; int main()
{
string digit;
cin >> digit; int len,i,j;
len = digit.length();
//N<=1直接输出
if(len <= )
{
cout << digit<<endl;
return ;
}
//当digit中有连续的相同数字,在从右到左遍历时仍然继续遍历
for(i=len-;i>=;i--)
if(digit[i]>digit[i-])break; //digit从右到左都是不减的,则不用调整
if(i==)
{
cout << digit<<endl;
return ;
}
//提取前i位
string pre = digit.substr(,i);
//提取后N-i位
string end = digit.substr(i,len-i); reverse(end.begin(), end.end()); //逆序 int index = pre.length();
int num =pre[index-];
for(j=;j<end.length();j++)
if(end[j]>=num)break; //交换第i位和第i+j位
pre[index-] = end[j];
end[j]=num; digit = pre+end;//合并即可 cout<<digit<<endl;
return ;
}

面试题----寻找比一个N位数大的“下”一个数的更多相关文章

  1. 一个区分度很大的iOS面试题

    @property 后面可以有哪些修饰符?@property中有哪些属性关键字? 属性可以拥有的特质分为四类: 原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确 ...

  2. 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

    1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...

  3. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  4. [转]趣题:一个n位数平均有多少个单调区间?---- From Matrix67

    考虑这么一个 14 位数 02565413989732 ,如图所示,它的数字先逐渐变大,然后开始变小,再变大,再变小,再变大,再变小.我们就说,它一共包含了 6 个单调区间.我们的问题就是:一个 n ...

  5. Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源,BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 各种后台管理系统

    Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 家庭理财系统 各种后 ...

  6. 将十进制数转为一个n位数的密码(每位都是个m进制数)

    例如一个6位数的10进制密码,共有106个密码,如果把每个6位数的密码编成号就是[0,106-1].这是十进制的情况,即6个位,每个位有10种选择.如果要遍历所有密码,需要6重for循环,每个循环10 ...

  7. 面试问题2:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字

    问题描述:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字 大数据操作: 解决方法一: 依次遍历文件数据, 开始32二进制清0 每次读取一个数,先和二进制位与,如果为0 则 ...

  8. 找一个四位数,要求该四位数的四倍刚好是该四位数的反序。 即b1b2b3b4 * 4 = b4b3b2b1

    找一个四位数,要求该四位数的四倍刚好是该四位数的反序. 即b1b2b3b4 * 4 = b4b3b2b1 解: 第一步,确认最末位 假设 b1b2b3b4 + b4b3b2b1 = [x0]x1x2x ...

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

    题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个 "水仙花 数 ", ...

随机推荐

  1. socket端口外网无法连接解决方法

    用socket做了个程序,本地测试没有问题,发布到服务器上时连接不上,用telnet测试连接失败 服务器上netstat -a 查看端口情况,127.0.0.1绑定端口9300处于监听状态,如下图: ...

  2. http://codeforces.com/contest/349

    A. Cinema Line time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  3. 课程作业02(关于Java的几点讨论)

    ---恢复内容开始--- 1.一个Java类文件中真的只能有一个公有类吗? public class Test { public static void main(String[] args) { } ...

  4. 在ASP.NET Core中如何支持每个租户数据存储策略的数据库

    在ASP.NET Core中如何支持每个租户数据存储策略的数据库 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: ht ...

  5. Saturday SQL Server 2016 初体验

    最近在开发一个有关数据库的项目,我想用SQLite,但是SQLite的设计器不是特别友好,然后据说VS有一个集成的SQLite设计器,但是我用的VS2017亲测并没有,用户体验不佳,所以安装一个SQL ...

  6. STM8学习 无法仿真原因Starting debug session... -> Emulator reset (usb://usb)... ** Connection error (usb://usb): swim error [30200]: st-link connection error

    刚调试程序时,STlink总是连不上,一直提示: Starting debug session...-> Emulator reset (usb://usb)...** Connection e ...

  7. cors解决ajax请求跨域问题

    Access-Control-Allow-Origin: * 适用tomcat部署的项目 在web.xml里添加以下内容 <filter> <filter-name>CorsF ...

  8. jquery定时刷新数据

    $(function () { setInterval("startRequest()", 3000); }); function startRequest() { $(" ...

  9. RabbitMQ与AMQP协议

    AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 ...

  10. Ubuntu使用Windows下的conio.h

    把虚线框里面的内容粘贴进文档文本里面 --------------------------------------------------------------------------------- ...