leetcode 258- Add Digits
来源:互联网 发布:二维数组整体排序java 编辑:程序博客网 时间:2024/06/05 01:07
leetcode题目汇集 — Add Digits
leetcode 258- Add Digits
题目要求
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 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
题目要求很简单,即对于给定的非负整数,将该数的各位相加直到各位相加的和小于10。
解法1
很容易想到用loop的方式得到最终结果,代码如下
public class Solution { public int addDigits(int num) { while (num > 9) { int temp = 0; while (num != 0) { temp += num % 10; num /= 10; } num = temp; } return num; }}
当然这种方法很笨,没有任何技巧性。
解法2
点击提示中的网址https://en.wikipedia.org/wiki/Digital_root,发现这是一个求数字根的问题。
数字根有一些性质
假设数字根为函数F
1.非负整数n的数字根m=1+(n-1)%9,即F(n)=1+(n-1)%9
2.任何数加9的数字根等于自身的数字根,即F(n+9)=F(n)
小学学加法的时候我们都明白,一个数字加9,就是把十位加1,个位减1。因此十位加个位的和是不变的;如果十位加1后仍然有进位,即十位上是9,那么进位之后十位会变成0,百位会加1,道理和一个一位数加9是一样的。
3.9乘任何数字的数字根都是9。
同样是小学时学乘法时,我们在计算一位数乘九的时候,把十只手指头排开,乘几便弯下第几只手指头,前后的手指个数便是那个结果。它的数字根永远是10-1=9。多位数的化,拆分每一位数字即可。
4.数字根的三则运算
1.两数之和的数字根等于这两个数的数字根的和数字根
对于两个一位数来说,很容易理解。因为一位数的数字根就是它本身。
对于多位数来说,由性质1,把每个数字mod 9,就又变成了两个一位数。
2.两数之积的数字根等于这两个数的数字根的积的和数字根
可以把每个数字拆成许多9相加的形式,最后各剩余一个 (a mod 9), 由
(a1+a2+…)(b1+b2+…)=a1(b1+b2+…)+a2*(b1+b2+…)+…+an*bm
从a1到a[n-1]都是9,由性质2,原来两式的数字根就是(an*bm)的数字根。而由性质1,可知an,bm又是两数本身的数字根。
3.一个数字的n次幂的数字根等于这个数字的数字根的n次幂的和数字根
知道数字根的定义以及性质,很容易写出不用loop的代码
public class Solution { public int addDigits(int num) { return 1 + (num - 1) % 9; }}
- leetcode 258: Add Digits
- 258Add Digits - LeetCode
- leetCode #258 Add Digits
- [LeetCode 258] Add Digits
- LeetCode(258)Add Digits
- leetcode-258-Add Digits
- [leetcode 258]Add Digits
- [Leetcode]#258 Add Digits
- LeetCode 258----Add Digits
- LeetCode 258 : Add Digits
- 【LeetCode】258 Add Digits
- Leetcode - 258 - Add Digits
- leetcode 258 :Add Digits
- leetcode 258--Add Digits
- leetcode 258 Add Digits
- Leetcode #258 Add Digits
- LeetCode 258:Add Digits
- LeetCode 258:Add Digits
- Android DiskLruCache 源码解析 硬盘缓存的绝佳方案
- HDU1039 Easier Done Than Said?
- 盘点六款逆天级效率工具,能帮创业公司节省50%时间成本
- 实现JavaScript中继承的三种方式
- 并查集
- leetcode 258- Add Digits
- MTK平台ATA测试LCM出现Not Support
- hdu1080(最长公共子序列变形)
- Android IntentService完全解析 当Service遇到Handler
- Java线程与Linux内核线程的映射关系
- 模拟SpringMvc的实现(一)
- “区块链”究竟是什么鬼
- 异常
- 在页面中引入百度地图API的步骤以及Geolocation简单的使用