各位相加 | LeetCode刷题笔记

1,472 阅读2分钟

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战


相关文章

LeetCode刷题汇总:LeetCode刷题

一、题目描述


各位相加

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

从简单题目开始刷,锻炼自己的思维能力,为面试准备~

二、思路分析


  • 看看题目的示例,我们来理一理这个思路~

  • 示例 1:

    输入: 38
    输出: 2 
    解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
    
  • 进阶:

    你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
    
  • 虽然进阶版叫我们不要使用循环或者递归。

  • 但我们还是从笨办法开始吧。

  • 死循环,各位相加,一直加到最后数值为个位数为止返回!

三、AC 代码


  • 转字符数组循环破解法:

    class Solution {
        public int addDigits(int num) {
            while (true){
                char[] str = String.valueOf(num).toCharArray();
                if (num<10){
                    return num;
                }
                for (int i=0;i<str.length;i++){
                    num+=Integer.parseInt(String.valueOf(str[i]));
                }
            }
        }
    }
    
    • image-20210827140634619.png
    • 哈哈,直接超出时间限制了,证明这种方法不得行呀~
    • 循环大法瞬间不香了嗷!
  • 取摸破解法:

    • 首先我们再仔细看看这个题目的规律。
    • 能够被9整除的整数,各位上的数字加起来也必然能被9整除,所以,连续累加起来,最终必然就是9。
    • 不能被9整除的整数,各位上的数字加起来,结果对9取模,和初始数对9取摸,是一样的,所以,连续累加起来,最终必然就是初始数对9取摸。
    • 为啥会这样呢?
    • 除个位外,每一位上的值都是通过 (9+1) 进位的过程得到的。
    • 想一下算盘的进位机制。
    • 举几个例子吧
    int addDigits(int num)
    {
        if(0 == num % 9)
        {
            return 9;
        }
        return num % 9;
    }
    
    • 如何简化一下这个呢?

      return (num - 1) % 9 + 1;
      
    • 执行结果

    • image-20210827141053809.png

    • 所以说,有的东西是有固定的规律的,我们要善于总结,善于发现!

四、总结

  • 解题思路千千万,不管是本办法还好,还是奇思妙想的解法,能解决就是好办法!白猫黑猫能抓老鼠的猫就是好猫!
  • 这里列几个LeetCode的其他大神的解法作为参考!
  • 点击跳转:递归解法
  • 点击跳转:取模解法

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah