第二次做leetcode中的难度为easy的题-258

原创 2015年11月21日 20:15:53

今天做的仍然是难度为easy的题,昨天晚上和大卓哥讨论的时候,他一直在说我眼高手低,总觉得解决问题“不就是那样嘛”,但是真正写代码的时候会发现自己的想法不够全面,有时候体现在代码编译不通、有时候又是算法没想好或者根本想的不对。leetcode是一个很好地平台,因为这里可以提供很多有意思的题目,也会检查你写的代码对不对。

题目:

Add Digits
Total Accepted: 45239 Total Submissions: 95297 Difficulty: Easy
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?
Hint:
A naive implementation of the above process is trivial. Could you come up with other methods?
What are all the possible results?
How do they occur, periodically or randomly?
You may find this Wikipedia article useful.https://en.wikipedia.org/wiki/Digital_root

分析:如果不考虑时间复杂度,我想到的算法如下:

AD1:提取这个整数每个数位上的数字--取模、除以10-再取除以10。直到除以10的结果为0。(用到循环)

AD2:讲各个数位上的数相加,如果小于10,则直接返回。否则,相加得到的这个数用到AD1中。()

public static int DigitalRoot(int n){
int m=0;
while(n!=0){
m=m+n%10;
n=n/10;
}
if (m<10){
return m;
}else{
return DigitalRoot(m);//递归
}
 
}

考虑时间复杂度的话,就要考虑Digital Root的性质,这里有三条性质比较重要:

1.一个数的数根加9等于这个数的数根;

2.一个数乘以9之后的数根为9;(说明如果一个数是9的倍数,那么它的根为9)

3.\mathit{dr}(a+b) \equiv \mathit{dr}(\mathit{dr}(a)+\mathit{dr}(b) ).

4.\mathit{dr}(a \times b) \equiv \mathit{dr}(\mathit{dr}(a)\times\mathit{dr}(b) ).

所以,一个数可以看成是数根以及9的倍数之和,即dr(r+9*i)=dr(r)+dr(9*i)=dr(n)+dr(9)=r(r<9);

public class Solution {
    public int addDigits(int n) {
        if(n%9>0||n==0){ //注意边界
            return n%9;
        }else{
            return 9;
        }
    }
}

或者直接用wikipedia的方法:

public class Solution {
    public int addDigits(int n) {
        return n-9*((n-1)/9);
    }
}

总结:用Wikipedia方法比较巧妙,时间复杂度上很占优势,但是或者需要我们有在短时间内找出潜在规律的能力,或者需要我们的一些经验知识。用普通的递归方法时间复杂度较高。

相关文章推荐

LeetCode [448. Find All Numbers Disappeared in an Array] 难度[easy]

LeetCode [448. Find All Numbers Disappeared in an Array] 难度[easy]题目Given an array of integers where ...

LeetCode [292. Nim Game] 难度[easy]

LeetCode [292. Nim Game] 难度[easy]题目You are playing the following Nim Game with your friend: There is...

[leetcode]题解+经验总结 自己做法+评论区mostvotes汇总 (只包含部分easy难度)

鉴于最近是实习季,可能有很多小伙伴在刷leetcode,我把easy部分刷到的一些有趣的题和大家分享下,也是为了复习总结下,每道题都包含了我自己的做法和评论区 Most Votes的做法,有些做法真令...

Leetcode - Math -258. Add Digits(数位求和,规律题)

1. Problem Description  Given a non-negative integer num, repeatedly add all its digits until the r...

刷leetcode过程中记录难度题,自己做法及最优做法

leetcode 41. First Missing Positive Given an unsorted integer array, find the first missing positiv...

[编程题] LeetCode上的backTracking类型的题目-难度Medium

最近把LeetCode上的backTracking的题目做了一下,发现都是一个套路~ backTracking链接:https://leetcode.com/tag/backtracking/ 还...

用java解leetcode上easy题3

我的第三题: 226. Invert Binary Tree 还是不习惯写封装的函数,写着写着,怎么就找不到输入输出了呢?这道题本来方法很简单,两个递归调用就解决了,而且还是0ms,可是我想还原完...

LeetCode的easy题集合(C++实现)二

1.Intersection of Two Linked Lists Write a program to find the node at which the inte...

【LeetCode-258】Add Digits(C++)

题目要求:给出一个非负整数num,重复的将num各个位上的数字加在一起,一直得到的结果是个位数。                    如:num=38,则3+8=11,1+1=2。最后得到个位数字...

leetcode算法——258:Add Digits(基于JAVA)

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第二次做leetcode中的难度为easy的题-258
举报原因:
原因补充:

(最多只允许输入30个字)