博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 258-Add Digits
阅读量:7046 次
发布时间:2019-06-28

本文共 1121 字,大约阅读时间需要 3 分钟。

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

For example:

Given num = 38, the process is like: 3 + 8 = 111 + 1 = 2. Since 2 has only one digit, return it.

Follow up:

Could you do it without any loop/recursion in O(1) runtime?

这道题的本质就是求数根(digital root),直接求的方法很简单,使用循环直接按照要求让num小于10就可以了,如果使用O(1)的时间复杂度当然不能这样做了。

分析如下:11的数根是2,2+9=11,为什么加了9之后就相等了呢,因为2+9进了1位,相当于十位从0变为1,但是个位减了1,从2变为了1。加上9的效果就是从个位减1 十位加1,这样就抵消了,所以数根相同。因此可知一个数,若为个位数,你们数根为其本身;若不是个位数,那么数根为该数mod 9到一个个位数(比如18,mod9==0,明显它的数根是9,因此需要用一个方式避免这种情况)

麻烦一点:

1 class Solution { 2 public: 3     int addDigits(int num) { 4         if(num<=9) 5         { 6             return num; 7         } 8         else 9         {10             int a=num%9;11             if(a==0)12             {13                 return 9;14             }15             else16             {17                 return a;18             }19         }20     }21 };

嘿嘿这个有点麻烦呢。。

怎么把他简单一点呢,直接这样就可以啦,

return (1 + (num-1) % 9);

这样就可以避免18,27.....这种情况啦

 

参考:

[1]https://en.wikipedia.org/wiki/Digital_root

转载于:https://www.cnblogs.com/liuyifei/p/Add_Digits.html

你可能感兴趣的文章
Netflix Media Database - 起源和数据模型
查看>>
oracle查看执行计划
查看>>
深度强化学习从入门到大师:通过Q学习进行强化学习(第二部分)
查看>>
iptables快速记忆总结
查看>>
专访张银奎:要抓住技术发展趋势,只有不断学习和更新自己?
查看>>
mint-ui 的navbar踩坑记
查看>>
【直播回顾及资料下载】Fusion Design - 企业级UI解决方案揭秘
查看>>
Meta标签大集合
查看>>
Gitea 1.8.0 发布,组织可设置为公开、内部与私有状态
查看>>
Apache Subversion 1.12.0 发布,版本控制系统
查看>>
MyBatis Dynamic SQL 1.1.1 发布,生成动态 SQL 的框架
查看>>
Opera 60 正式发布,代号 Reborn 3
查看>>
《Java8实战》-第十章笔记(用Optional取代null)
查看>>
IPTables简介四——目标(动作)
查看>>
Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
查看>>
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)...
查看>>
用Python告诉你,现在的房租有多高?
查看>>
CSS3动画表单
查看>>
Spring Data JPA 持久层开发
查看>>
轻松 get 报表模糊查询技能
查看>>