题目要求如下:

如果一个数字十进制表达时,不存在连续两位相同,则称之为“不重复数”。例如,105、164和198都是“不重复数”,而11、100和122不是。实现一个函数,用一个long类型( long类型数字A),实现返回大于A的最小“不重复数”。

看到两个朋友在做这个算法题

趣味算法:返回不重复数的实现  夏小冰

算法,一个永恒的话题,挑战你的编程之美 winzheng

夏小冰的代码,运算时1122, 18, 21,123, 98都有正确结果,但是100011,121989999的答案是错的

winzheng的结果如下

A=1122, 18, 21,123, 98,100011,121989999

结果:1201,19,23,124,101,101010,123010101

看起来功能都是实现了

但是仔细看代码他是把输入的A不断加1,并且判断结果的数字是否符合要求?

//只要是一个人,就不会这么去做的(sorry,兄弟)
*其实我们在编程的时候更多的要从自身角度出发。从问题的固有规律出发,设想一个人是如何来解决这个问题的。并且把解决问题的步骤转化为程序,就能写出比较好的算法了。

想想如果给一个人一个100位长的数字,他会用这种不断加1的办法来解决问题吗?

《编程之美》

这个是winzheng的标题,不过从他的代码里只能感受到对CPU无情的蹂躏。

以至于

如果数据更大,例如:121989999991999,花了好几分钟也没算出来,这个时候真的需要考虑时间复杂度等问题了。

解决这个问题只要把计算机当人看就可以了

1、将输入数加1

2、人类会从最高位的下一位作为当前位开始逐位寻找相邻的连续数,如果没有,则该数字就是目标值

3、如果当前位和前一位相同,把当前位的数字加1

3.1 如果加1后导致进位,则当前位等于前一位,前一位加1,返回3.1

3.2 加1后不进位,返回原始数字最高位到当前位的数据,后续拼接上“0101…”组成的剩余部分即可

3.3 进位到最高位,则返回1,后续拼接上“0101…”组成的剩余部分即可

代码如下

public static long GetNextNotDuplicatedValue4(long a)
        {
            //原始数据转换成数组
            char[] arr = a.ToString().ToCharArray();
            //从最高位的下一位作为当前位开始逐位寻找相邻的连续数
            for (int i = 1; i < arr.Length; i++)
            {
                //如果相邻两位重复
                if (arr[i - 1] == arr[i])
                {
                    //如果当前位和前一位相同
                    while (i > 0 && arr[i - 1] == arr[i])
                    {
                        //把当前位的数字加1
                        arr[i] = (char)((arr[i] - 48 + 1) % 10 + 48);
                        //如果加1后导致进位
                        while (i > 0 && arr[i] == '0')
                        {
                            //前一位加1
                            arr[i - 1] = (char)((arr[i - 1] - 48 + 1) % 10+48);
                            //当前位等于前一位
                            i--;
                        }
                    }

//加1后不进位(i != 0),返回原始数字最高位到当前位的数据,后续拼接上“0101…”组成的剩余部分即可
                    //进位到最高位(i == 0),则返回1,后续拼接上“0101…”组成的剩余部分即可
                    string t = i == 0 ? "1" : new string(arr.TakeWhile((item, index) => index <= i).ToArray());
                    return long.Parse(t + makestring2(arr.Length - i-Math.Sign(i)*1));
                }
            }
            //如果没有,则该数字就是目标值
            return a;
        }

static string makestring2(int i)
        {
            StringBuilder s = new StringBuilder(i);
            for (int j = 0; j < i; j++)
            {
                s.Append(j % 2==0? "0" : "1");
            }
            return s.ToString(); ;
        }

运行速度仅和A的位数部分相关

计算121989999991999也是瞬间的

总结:

把计算机当亲兄弟来看待,虽然他傻得只会不知疲倦得做加法

另外:

算法绝不是书上学来的那几种

环顾一下四周,想想人类是如何改变世界的,然后再让计算机兄弟来帮忙

测试数据也是非常重要的一个东西

转载于:https://www.cnblogs.com/Chinese-xu/archive/2009/09/05/1560905.html

真正的不重复数字实现,像人一样去编程相关推荐

  1. Pythonic:递归、回溯等5种方法生成不重复数字整数

    问题描述:从0到9这10个数字任选3个不重复的数字,能构成哪些三位数? So easy!看到这样的问题,很多人会写出类似(注意,只是类似,我为了使得本文几个函数具有相同的调用形式,给demo1和dem ...

  2. 对话火山引擎总裁谭待:从同质化的云服务中突围 | 数字思考者50人

    ▎多云的趋势,对于数据消费场景的重视,再结合抖音电商的火热生态,给了火山引擎在云计算市场发力追赶的强力信心. 作者|杨丽 编辑|刘湘明 本文首发于钛媒体APP 钛媒体特别专题策划<数字思考者50 ...

  3. 百丽季燕利:从补货场景,看企业协同在线|数字思考者50人

    图片来源:视觉中国 ▎对于传统大型组织而言,从战略到落地,关系到经营管理和运营执行的千万次决策,需要跨多个部门.多个不同岗位去执行落地,这其中协同的难度会随着组织的规模.业务类型.结构.层级.参与的人 ...

  4. 数组专题——找重复数字 利用下标

    找出任一重复数字 数组范围0-n-1 bool duplicate(int numbers[],int length,int *duplication){//传地址,通过参数返回重复数字//robus ...

  5. 题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现)

    题目:查找数组中的重复数字,要求空间复杂度为O(1)(基于Java实现) 题目: 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字 ...

  6. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II

    题目: 删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A ...

  7. 无重复数字的随机数字数组

    这几天看MFC,头晕眼花,也觉得没有什么可以写的. 今天学习之余,看到一个面试题"1000个范围0-2000的数字,进行排序打印出来".就想着实现一下. 第一步先要建立1000个范 ...

  8. 有不含有重复数字的数组构造二叉树_Leetcode刷题记录:构建最大数二叉树

    题目要求,题目地址 给定一个不含重复数字的数组,最大二叉树构建规则如下: 1.根是数组中最大的数字 2.左边的子树是最大数字左边的内容 3.右边的子树是最大数字右边的内容 答案 class Solut ...

  9. 整数数组查找java_使用Java编写程序以查找整数数组中的第一个非重复数字?

    查找数组中的第一个非重复数字-构造count数组以将给定数组中每个元素的计数存储为相同长度,且所有元素的初始值为0. 将数组中的每个元素与除自身之外的所有其他元素进行比较. 如果匹配发生,则增加其在计 ...

最新文章

  1. Linux基本命令之vi
  2. 前后端项目中跨域问题
  3. 【MySQL】求每门科目成绩排名前二的学生信息
  4. 5个IO口扫描25个按键的解决方法(转帖)
  5. 《每日一题》290. Word Pattern
  6. 前端每日实战:142# 视频演示如何用 CSS 的 Grid 布局创作一枚小鸡邮票
  7. Nginx——debug的使用
  8. Angular应用页面里appId的生成逻辑和位置
  9. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)
  10. layui + echarts股票K线图(含案例、代码、截图)(转载篇)
  11. mysql桦仔_Microsoft SQL Server 2005技术内幕:T-SQL查询笔记
  12. 题解——洛谷P2734 游戏A Game 题解(区间DP)
  13. install openni2 on ubuntu
  14. missing 1 required positional argument: ‘on_delete‘报错解决方案
  15. nginx服务器防sql注入/溢出***/spam及禁User-agents
  16. office2019初体验与kms服务器搭建
  17. 如何看待“英特尔是一家软件公司”?
  18. CRMEB单商户标准版上线了!
  19. Kali linux渗透测试系列————29、Kali linux 渗透攻击之无线网络攻击
  20. python矩阵乘法 点乘_Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)

热门文章

  1. have sb do / have sb doing / have sth dong 区别
  2. 关于release后retainCount还是1的问题
  3. wordpress图片水印插件DX-Watermark
  4. 微软MCITP系列课程(一)第一讲:部署虚拟机
  5. 2012_01_26
  6. POWER-BI开发版功能简介
  7. 浅谈STM32的DMA模块的使用
  8. mysql的高级特性
  9. 简析服务端通过geotools导入SHP至PG的方法
  10. DataTable筛选符合条件的DataRow