LeetCode算法题-Add Digits(Java实现-3种解法)

这是悦乐书的第199次更新,第207篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258)。给定非负整数num,重复添加其所有数字,直到结果只有一位数。例如:

输入:38

输出:2

说明:过程如下:3 + 8 = 11,1 + 1 = 2。由于2只有一位数,所以请将其返回。

跟进:你可以在O(1)运行时间内没有任何循环/递归的情况下执行此操作吗?

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:如果num小于10,直接返回num即可。

正常情况:此解法是利用递归,因为每计算一次后得到的结果还是相同的问题。因为题目给定的是正整数,所以可以借助字符串来操作。先将num转为字符串,然后依次获取字符相加,得到每位数的和,然后继续调用自身。

public int addDigits(int num) {
    if (num < 10) {
        return num;
    }
    String str = num+"";
    int sum = 0;
    for (int i=0; i<str.length(); i++) {
        sum += str.charAt(i)-'0';
    }
    return addDigits(sum);
}


03 第二种解法

特殊情况:如果num小于10,直接返回num即可。

正常情况:此解法是利用迭代,使用两层循环,外层判断大小,内层进行数据计算,先对10取余,再除以10,进入下一位接着计算,如果算到最后一位,跳出内层循环,此时还要加上对10取余的余数,因为内层循环只是做判断,然后将算出的和赋值给num,sum归为0,再开始下一次的循环。

public int addDigits2(int num) {
    if (num < 10) {
        return num;
    }
    int sum = 0;
    while (num >= 10) {
        while (num/10 != 0) {
            sum += num%10;
            num /= 10;
        }
        sum += num%10;
        num = sum;
        sum = 0;
    }
    return num;
}


04 第三种解法

可以先计算一部分数据,找找规律。

9 --> 9 --> 9%9=0 ?

10 --> 1 --> 10%9=1

13 --> 4 --> 13%9=4

18 --> 9 --> 18%9=0 ?

19 --> 1 --> 19%9=1

22 --> 4 --> 22%9=4

25 --> 7 --> 25%9=7

27 --> 9 --> 27%9=0 ?

29 --> 2 --> 29%9=2

33 --> 6 --> 33%9=6

36 --> 9 --> 36%9=0 ?

37 --> 1 --> 37%9=1

39 --> 3 --> 39%9=3

43 --> 7 --> 43%9=7

45 --> 9 --> 45%9=0 ?

46 --> 1 --> 46%9=1

49 --> 4 --> 49%9=4

通过上面这些数的计算,可以发现最后计算出的结果是有周期的,从1到9不断循环,并且除了9的倍数以外的数,其他的数都可以间接通过对9取余得到最后的结果,但是以9为倍数的整数,我们可以曲线救国,将原数减1后再对其取余,然后再把1补上。最后我们得到这样的公式:(num-1)%9 + 1。

public int addDigits3(int num) {
    return (num-1)%9 + 1;
}


05 小结

算法专题目前已连续日更超过一个月,算法题文章63+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    AIM外星人阅读 1,302评论 0 1
  • 要先弄清楚,丑在哪里! 其实很多人用公司的模板做PPT会觉得丑,其实不是我们真正意义上面的丑,而是自己没有遵循一定...
    汤帅同学阅读 1,268评论 0 3
  • 人生若只如初见 妈妈,我愿把你笑容保鲜 不让风霜入侵你的鬓尖 人生若只如初见 妈妈,我愿挺拔你的腰间 不让日子使你...
    舒己怀_Frank阅读 3,007评论 103 109
  • 會採取行動,只有二個原因 1.追求快樂 2.逃離痛苦 你為什麼可以做這麼多事情 你的渴望度有多高?! 逹成目標 在...
    twappleon阅读 283评论 0 1
  • 伊万十八岁的时候就已经拥有自己的店有一年了,店名叫【小万的家】可是这个小万指的却不是伊万,而是一只仓鼠。 七岁的时...
    夏天的夏小蝉阅读 349评论 0 0

友情链接更多精彩内容