【座右铭】1. 想要成为行家,就必须尝试解决大量的问题;

2. 解决大量问题并不代表能解决所有问题,而是表示解决下一个问题的几率变大了

1. 已知一个整数集合T,集合中可以包括0到9之间任意数,集合中数字不重复。现在给出一个整数N,大小按int类型,算法要求是:从上面集合中取出数字所能组成的整数中,比给出的N大的集合里面, 最小的那个整数。比如,整数集合T=『1,2,3』,整数N=300,那么要从集合中取出数字所组成的整数应该是311;再如:T=『1』,N=56,那么要得到的整数应该是111(也就是说集合里面的 数可以取多次);【问题来源于论坛】

第一部分:

思路一: 从小到大遍历[N+1, IntegerMax],找出满足所有数字在集合T中的第一个整数

思路二:对整数N,从N的最高位向最低位扫描,求出满足条件的整数M

1)若Ni位不是最后1位,且在集合T中出现,则Mi=Ni

2)若Ni位是最后1位,或者不在集合T中出现,则

2.1) 若集合T中存在大于Ni且最小的数字a,让Mi=a。然后让余下的位置(比i位要低的位置)都取T中的最小值

2.2) 若集合T中不存在大于Ni的数字,则对Mi-1位进行处理。找出比Mi-1位数字大的且在集合T中的元素,若Mi-1位仍不满足,则继续前进找Mi-2位,直到满足条件为止(最坏情况下多补1个最高位)。然后将余下的位置(比满足条件的位置要低的位置)都取T中的最小值

第二部分:

//java代码,T为集合,len为集合T中元素个数,N为整数

//不考虑异常情况:例如N为负数,或者是整数最大值

public static int greater(int[] T, int len, int N){//初始化集合Tboolean[] set = new boolean[10];int min = 10;for(int i=0;i<len;i++){min = (min>T[i])? T[i]:min;set[T[i]] = true;}//初始化Aifinal int IntegerLen = 11;int[] source = new int[IntegerLen];int j = 0;if(N==0){source[j++] = 0;}else{while(N>0){source[j++] = N%10;N /= 10;}}j--;int[] target = new int[IntegerLen];int k = 1; //预留一位while(j>=0){if(j!=0&&set[source[j]]){//若Ni位在集合T中存在,则Mi=Nitarget[k++] = source[j];j--;}else{//在集合T中选取一个比Ni大且最小的数字int bigger = -1;for(int p=source[j]+1;p<10;p++){if(set[p]){bigger = p;break;}}if(bigger!=-1) //找到{target[k++] = bigger;j--;}else //未找到{int dis = k;k--;boolean flag = false;while(!flag){for(int p=target[k]+1;p<10;p++){if(set[p]){flag = true;target[k++] = p;break;}}if(!flag){k--;}}j += (dis - k);}//后面的数都取集合T中的最小值while(j-->=0){target[k++] = min;}}}//组成新的数字int M = target[0];int position = 0;while(++position<k){M *= 10;M += target[position];}return M;}

第三部分: 测试用例

T = {9,2,3}, N = 0: M = 2

T = {1,2,3}, N = 2: M = 3

T = {1,2,3}, N = 4: M = 11

T = {1,2,3}, N = 23: M = 31

T = {1,2,3}, N = 33: M = 111

T = {1,2,3,9}, N = 9999: M = 11111

2. 有这样一种编码:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位数一样,N,M可以均可以以0开头,N,M的各位数之和要相等,即1+3+4=1+4+3,且M是大于N中最小的一个,现在求这样的序列S,N为一个定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1))。【问题来源于v_JULY_v的博客:http://blog.csdn.net/v_july_v/article/details/6855788】

第一部分:

思路一: 从小到大遍历[N+1, IntegerMax],找出满足数字和相同的第一个整数

思路二:从低位往高位扫描

1)从低位往高位扫描,找出第一位大于0的位数i的数字a,将该位赋值0,将未分配的数字和T加上a-1,即T=T+a-1。将第i-1位(比i位高1位)数字b加1

1.1)若第i-1位的数字b<10,进入第2步

1.2)若第i-1位的数字b=10,则将该位赋值0,且T=T+9;将第i-2位数字c加1。直至找到满足条件的位置(最坏情况下多增加1位),进入第2步

2)将T从最低位向高位分配,直至T=0。分配原则为:小于等于9,全部放在当前配置;大于9,给当前位置放9

第二部分:

//java代码,参数说明:N为整数

//不考虑异常情况:如N负数,或者为0

public static int next(int N){//求出数字和final int IntegerLen = 10;int[] source = new int[IntegerLen];int i = 0, sum = 0;while(N>0){source[i] = N%10;sum += source[i];i++;N /= 10;}//从地位向高位走int j = 0;while(source[j]==0){j++;}//把高1位的位置加1int total = source[j]-1;source[j] = 0;j++;while(true){if(source[j]==9){source[j++] = 0;total += 9;}else{source[j]++;break;}}//将数从地位向高位分配int k = 0;while(total!=0){if(total<=9){source[k] = total;total = 0;}else{source[k++] = 9;total -= 9;}}//组合新数字int M = 0;for(int p=IntegerLen-1;p>=0;p--){M *= 10;M += source[p];}return M;}

第三部分:测试用例

N = 1: M = 10

N = 10: M = 100;

N = 20: M = 101;

N = 101: M = 110;

N = 110: M = 200;

N = 99: M = 189

数字问题---位数上的数字相关推荐

  1. 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

    //给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. //(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个 ...

  2. 数字经济建设在数字新技术体系上,数字新技术主要包括物联网、云计算、大数据、人工智能、区块链等五大技术

    40年以来,中国经济发展经历两大历史性变革,第一次是20世纪八九十年代,从计划经济转向市场经济,社会生产力大解放,经济高速度增长,中国成为世界第二大经济体,实现第一次历史性的大变革.第二次是21世纪从 ...

  3. java怎么判断数字几位数_Java判断数字位数的方法总结

    Java判断数字位数的方法总结 发布于 2020-7-5| 复制链接 本文给大家整理了Java判断数字位数的两种常用方法,对此有兴趣的可以跟着小妖一起学习下. 普通方法: ```java import ...

  4. java 数字的位数_Java判断数字位数的方法总结

    普通方法: import java.util.scanner; public class digits { public static void main(string[] args){ scanne ...

  5. * 四、要求写一个方法:method。该方法要求传入一个数字n(n要小于10), * 该方法能够计算得到所有各位上的数字不超过n且每一位的数字都不重复的三位数的个数。

    package Day04;/*** 四.要求写一个方法:method.该方法要求传入一个数字n(n要小于10),* 该方法能够计算得到所有各位上的数字不超过n且每一位的数字都不重复的三位数的个数.* ...

  6. 输入一个四位数将其加密后输出c语言,输入一个四位数,将其加密后输出.方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十...

    问题描述: 输入一个四位数,将其加密后输出.方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十位上的数字互换,组成加密后的新四位数. #include int m ...

  7. C++语言基础:输出一个整数的个位十位百位上的数字

    功能描述 输入一个数,如一个三位数,输出其个位.十位.百位上的数字 如 123 这个数 求个位: 对 10 取模(123 % 10 = 3 即可), 求十位, 先把 123 除以 10,得到 12, ...

  8. FPGA学习——数字密码锁(上)

    基于FPGA的数字密码锁 一.简介 1.1设备要求 1.2 功能要求 二.工程分析: 三.具体程序: 顶层模块: 1.矩阵键盘扫描模块 2.功能划分模块 第三.第四模块在下篇中 四.总结: 一.简介 ...

  9. python输入一个正整数、计算其各个位的数字之和_C语言程序设计:编写程序,输入一个正整数,统计该整数的位数并计算其各个数位上的数字之和。...

    点击查看C语言程序设计:编写程序,输入一个正整数,统计该整数的位数并计算其各个数位上的数字之和.具体信息 答:#include /*包含头文件*/void main() /*主函数*/{ int n, ...

最新文章

  1. 关于xshell连接虚拟机和虚拟机连网
  2. Oracle入门第四天(上)——表管理与数据处理
  3. python读法1002python读法-Python教程之绘制Mandelbrot集合
  4. 《推荐系统实践》要点思维导图
  5. Java获取并Kill系统进程
  6. vue 将行转换成对象_Vue简化版实现
  7. 软考 - 可靠性和可用性
  8. shell 管道命令 、、||、>、>>(精)
  9. Java中abstract关键字详解
  10. faster RCNN之RPN详解
  11. IT计算机实习:JAVA实习报告范文(三)
  12. google linux桌面快捷方式,centos7 rhel7 linux下怎么安装google chrome 设置谷歌浏览器桌面快捷方式...
  13. html5框架如何快速搭建,AmazeUI框架搭建的方法步骤(图文)
  14. xgboost 怎么读_你真的会读书了吗?五本书让你会读书,读好书,好读书!
  15. Oracle 协议设配器错误解决方案
  16. Memcached命名空间
  17. 惊了!苹果高通在中国纠缠时 iPhone7/8却在德国惨遭下架
  18. RedHat RHEL7.2 系统安装详细步骤
  19. 坐标型动态规划——轰炸敌人
  20. ThinkPHP5.0商城项目目录搭建(菜鸟)

热门文章

  1. 5G芯片Top10一览,谁才是最后的赢家?
  2. [总结] VLAD NetVLAD NeXtVLAD
  3. 偏序关系以及最大元,最小元,极大,极小元和上下界与上下确界
  4. 在linux下看中大网络电视
  5. 使用 Blender SDF Exporter导出sdf文件
  6. 鼠标微动开关选择参考
  7. Python有道词典
  8. windows10中java调用python脚本
  9. 【初识LSTM——长短期记忆网络】生动介绍(图文版)
  10. 使用vue-cookies操作cookie