概述
前言
LeetCode 258 题目难度等级,easy(官方给的)。leetcode258
题目描述
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.
挑战:
Could you do it without any loop/recursion in O(1) runtime?
不要使用循环和递归实现,只用O(1)的时间复杂度。(ps:后文会给出leetcode中大神的实现)
大致意思:给出一个整数,计算各位的和,直到计算结果为个位数时,返回该结果。
非递归版解法:
public int addDigits(int num) {
// 存储每位数的和
int sum = 0;
while (num >= 10) {
// 并不能确定数字会执行多少次,所以一定是使用while 循环,而且一定是两层循环的嵌套,
// 且这两个嵌套都不知道什么时候执行结束。---while与for循环的区别。
while (num != 0) {
int digit = num % 10;
sum += digit;
num /= 10;
}
num = sum;// 更新num的值
sum = 0;// 对sum清零,准备存储下一个整数的各位的值
}
return num;
}
解题题眼:
1、当不知道循环执行多少次时,只能使用while循环实现。
2、循环的出口是:当计算后的结果是[0,10)区间内的
递归版解法
public int addDigits(int num) {
if (num < 10 && num >= 0) {
return num;
}
// 递归实现整数的各位求和
int sum = sumNumInEachDigit(num, 0);
return addDigits(sum);
}
/**
* 递归实现整数的各位求和
*
* @param num
* @param sum
* @return
*/
public int sumNumInEachDigit(int num, int sum) {
if (num == 0) {
return sum;
}
sum += (num % 10);
return sumNumInEachDigit(num / 10, sum);
}
递归的基础程序:
/**
* 基础的程序,打印整数的每个数字
*
* @param num
*/
public void printEachNumInDigit(int num) {
if (num == 0) {
return;
}
System.out.println(num % 10);
printEachNumInDigit(num / 10);
}
题眼:
递归版的解法是基于基础程序修改的。步骤:
1、在能写出使用递归打印每位的数字后,
2、然后再来求个各位上的和,
3、实现上层递归,上层递归出口就是[0,10)区间返回。
LeetCode discussion 题解:
/**
* 大神代码一
*
* @param num
* @return
*/
public int addDigits(int num) {
return num == 0 ? 0 : (num % 9 == 0 ? 9 : (num % 9));
}
/**
* 大神代码二
* @param num
* @return
*/
public int addDigits2(int num) {
return 1 + (num - 1) % 9;
}
类似题目:
leecode 202 HappyNum
题目归类:数论
最后
以上就是贪玩滑板为你收集整理的leetcode258 题解的全部内容,希望文章能够帮你解决leetcode258 题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复