这是我参与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])); } } } }
- 哈哈,直接超出时间限制了,证明这种方法不得行呀~
- 循环大法瞬间不香了嗷!
-
取摸破解法:
- 首先我们再仔细看看这个题目的规律。
- 能够被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;
-
执行结果
-
所以说,有的东西是有固定的规律的,我们要善于总结,善于发现!
四、总结
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah