第二次做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 [292. Nim Game] 难度[easy]

LeetCode [292. Nim Game] 难度[easy]题目You are playing the following Nim Game with your friend: There is...
  • just_lwten
  • just_lwten
  • 2017年03月16日 21:35
  • 98

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 ...
  • just_lwten
  • just_lwten
  • 2017年03月17日 00:59
  • 110

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

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

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

1. Problem Description  Given a non-negative integer num, repeatedly add all its digits until the r...
  • Chrome_matrix_68
  • Chrome_matrix_68
  • 2016年08月15日 10:31
  • 272

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

最近把LeetCode上的backTracking的题目做了一下,发现都是一个套路~ backTracking链接:https://leetcode.com/tag/backtracking/ 还...
  • notHeadache
  • notHeadache
  • 2016年08月29日 17:45
  • 404

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

leetcode 41. First Missing Positive Given an unsorted integer array, find the first missing positiv...
  • u012980855
  • u012980855
  • 2017年05月05日 19:23
  • 126

leetcode 258- Add Digits

leetcode题目汇集 — Add Digitsleetcode 258- Add Digits 题目要求 Given a non-negative integer num, repeatedl...
  • u011732614
  • u011732614
  • 2016年11月26日 13:03
  • 149

用java解 leetcode上easy题2(开始探险)

我的第二题: 299. Bulls and Cows import java.util.*; public class Solution { String secret,guess...
  • u112222222
  • u112222222
  • 2016年01月02日 19:28
  • 286

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

1.Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s...
  • zhulong890816
  • zhulong890816
  • 2015年05月03日 11:17
  • 229

Leetcode: Binary Tree Paths 从一道Easy题看Java String链接效率

从一到Leetcode简单题看Java字符串链接方法之间的效率差异
  • Alfred_lang
  • Alfred_lang
  • 2016年03月21日 06:53
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第二次做leetcode中的难度为easy的题-258
举报原因:
原因补充:

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